Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel护照-多重警卫问题_Php_Oauth_Laravel Passport - Fatal编程技术网

Php Laravel护照-多重警卫问题

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

提前谢谢大家,, 我需要多个laravel passport守卫,因为我的系统有2种用户类型,1)管理员,2)普通用户。 对于这两者,我有单独的路由和身份验证模块(登录、注册、注销等)。所以我需要一个单独的passport守卫来进行API身份验证。下面是我添加的一些代码

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好的,非常感谢您的帮助和时间:)