Session variable enhancer
Session variables là các variables của 1 phiên request dùng để định danh user và các thông số đi kèm nhằm phục vụ cho authorization / access control.
info
Nếu như hệ thống authentication (authn) của bạn không sử dụng webhook authentication thì hãy bỏ qua tài liệu này, vì toàn bộ session variables của end-user sẽ store trong JWT.
Hasura Extra webhook authn cung cấp session variable enhancer interface, dùng để building session variables cho phiên request của end-user.
- Đối với Laravel users
- Đối với Symfony users
Để enhance session variables bạn cần thêm enhancer class App\Http\Hasura\SessionVariableEnhancer
như sau:
<?php
namespace App\Http\Hasura;
use Hasura\AuthHook\SessionVariableEnhancerInterface;
use Psr\Http\Message\ServerRequestInterface;
class SessionVariableEnhancer implements SessionVariableEnhancerInterface
{
public function enhance(array $sessionVariables, ServerRequestInterface $request): array
{
if ($user = auth()->user()) {
$sessionVariables['x-hasura-user-id'] = (string)$user->getAuthIdentifier();
}
return $sessionVariables;
}
}
Tiếp đến bạn cần đăng ký enhancer trên vào auth.session_variable_enhancers
trong file config/hasura.php
:
return [
'auth' => [
'session_variable_enhancers' => [
\App\Http\Hasura\SessionVariableEnhancer::class
]
]
];
tip
Các enhancers đều được khởi tạo thông qua app container nên bạn có thể inject dependencies services nếu cần.
Theo ví dụ trên chúng ta tạo ra 1 enhancer để chèn X-Hasura-User-Id
cho request dựa trên user identifier đã đăng nhập.
Mặc định bundle cấu hình sẵn auto configuration tag hasura.auth_hook.session_variable_enhancer
cho các classes
implements interface Hasura\AuthHook\SessionVariableEnhancerInterface
nên chỉ cần bạn tạo
class implements interface trên sẽ được mark là enhancer và góp phần xây dựng session variables cho request, ví dụ:
namespace App\Security;
use Hasura\AuthHook\SessionVariableEnhancerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Symfony\Component\Security\Core\Security;
final class AuthenticatedSessionVariableEnhancer implements SessionVariableEnhancerInterface
{
public function __construct(private Security $security)
{
}
public function enhance(array $sessionVariables, ServerRequestInterface $request): array
{
if ($user = $this->security->getUser()) {
$sessionVariables['x-hasura-user-id'] = $user->getUserIdentifier();
}
return $sessionVariables;
}
}
Theo ví dụ trên chúng ta tạo ra 1 enhancer để chèn X-Hasura-User-Id
cho request dựa trên user identifier đã đăng nhập.