Php Laravel护照-多重警卫问题
提前谢谢大家,, 我需要多个laravel passport守卫,因为我的系统有2种用户类型,1)管理员,2)普通用户。 对于这两者,我有单独的路由和身份验证模块(登录、注册、注销等)。所以我需要一个单独的passport守卫来进行API身份验证。下面是我添加的一些代码Php Laravel护照-多重警卫问题,php,oauth,laravel-passport,Php,Oauth,Laravel Passport,提前谢谢大家,, 我需要多个laravel passport守卫,因为我的系统有2种用户类型,1)管理员,2)普通用户。 对于这两者,我有单独的路由和身份验证模块(登录、注册、注销等)。所以我需要一个单独的passport守卫来进行API身份验证。下面是我添加的一些代码 config/auth.php如下所示 'guards' => [ 'web' => [ 'driver' => 'session', 'prov
config/auth.php
如下所示
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
'api-admin' => [
'driver' => 'passport',
'provider' => 'admins',
'hash' => false,
]
],
这里我为管理员和用户定义了两个防护
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'table' => App\Models\Admin::class,
],
],
这里我为管理员和用户定义了两个提供者
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'table' => App\Models\Admin::class,
],
],
现在我正在创建类似令牌的
$tokenResult = $user->createToken('TOKEN_DEMO');
$token = $tokenResult->token;
$token->save();
$accessToken = $tokenResult->accessToken;
使用AuthyId=1对管理员用户产生预期效果(例如,考虑用户ID=1) 这是关于为管理员用户生成令牌的
与普通用户登录和生成令牌的方式相同,这也将为oauth\u clients
表中user_id=1的用户生成令牌
该表如屏幕截图中所述
问题是,如果普通用户注销,则自动管理用户的令牌将被销毁,因为在oauth\u clients
表中,这两个用户的用户id都是1,而这两个用户的防护措施都不同
请帮我解决同样的问题,这也是一个安全问题,因为与管理员具有相同id的用户可以通过管理员身份验证中间件。 下面的方法是我发现的最干净的解决方法。 你必须为你的警卫使用不同的客户端。 你必须跑
passport:install
如果您有两名保安使用护照,则两次。它将生成两个客户端。
在新版本的Passport中(我认为在Laravel 8发布之后),当您创建客户端时,它会要求您提供一个提供者(在auth.providers配置中定义)。每个提供者需要一个客户端。如果您使用的是旧版本,则可以在oauth_clients表中手动分配提供程序。
现在,在生成令牌时,您必须指定客户端id。
在旧版本中,您可以通过更改其中一个Passport类的公共属性来实现这一点,但现在您应该再次注册ClientRepository
App::clearResolvedInstance(ClientRepository::class);
app()->singleton(ClientRepository::class, function () {
return new ClientRepository(User::CLIENT_ID, null); // You should give the client id in the first parameter
});
$token = $user->createToken('TOKEN-EXAMPLE');
$accessToken = $token->accessToken;
现在,如果您检查access tokens表,您可以看到客户端ID是不同的。
现在一切都好了
您提到撤销令牌可能会有问题,但我相信即使在您的情况下(使用相同的客户端,而不是指定提供者),如果您撤销与admin具有相同id的用户令牌,admin的令牌仍将保留。正在撤消用户令牌:
$user = Auth::guard('user-api')->user();
$user->token()->revoke();
您好,非常感谢您的回答,您节省了我的时间,我已经实现了您创建令牌的代码,而关于撤销令牌,我有一个问题,目前,我正在撤销某个特定用户登录时的所有现有令牌,因此该用户以前的所有会话都将被销毁,我这样做是通过循环用户的令牌,然后$token->delete()完成的,但它也在删除管理客户端令牌,我只想删除客户端用户token@RonakSolanki你好,不客气。您不应该删除某个用户的所有令牌。正如我在回答的最后提到的,您应该只撤销当前用户的令牌$user=Auth::guard('user-api')->user()$用户->令牌()->撤销();无论如何,删除令牌不是一个好的做法。即使您想禁用令牌,也可以使用revoke函数$token->revoke()是的,我知道,如果我想撤销特定客户机的特定用户以前的所有令牌,那么有可能吗?目前,如果我撤销用户角色的令牌,那么它也将被撤销admins@RonakSolanki对首先获取该客户机的令牌$tokens=\Laravel\Passport\Token::where('client_id',1)->get();然后在每个令牌上使用Foreach和call revoke好的,非常感谢您的帮助和时间:)