猿问

Laravel 护照阻止用户使用相同的凭据登录

我使用 Laravel Passport 允许我的手机调用 laravel api 以使用 laravel 身份验证。

我最近发现了一个问题,laravel 护照允许同一个用户从多个设备登录。有什么解决方案可以防止同一用户同时登录其他设备吗?

我找到了一种使用 Laravel Passport 注销的方法,但如果我使用,我不知道这是否是最好的方法

$request->user()->token()->revoke()

每当用户尝试登录时。


紫衣仙女
浏览 156回答 3
3回答

慕工程0101907

您可以挂钩该AccessTokenCreated事件,然后在您的侦听器中您可以撤销任何现有的令牌。将这些事件/侦听器添加到您的 EventServiceProvider'Laravel\Passport\Events\AccessTokenCreated' => [    'App\Listeners\RevokeExistingTokens',],然后使用创建一个侦听器 php artisan make:listener RevokeExistingTokens然后在handle函数内部:$user = User::find($event->userId);$user->tokens()->offset(1)->get()->map(function ($token) {    $token->revoke();});这将删除除刚刚创建的用户令牌之外的所有用户令牌。

牛魔王的故事

考虑到@Lucas Dalmarco 对@atymic 回答有关 MySQL“偏移”命令问题的评论。这是一个可以实施的变通解决方案。$user = User::find($event->userId);$user->tokens()->limit(PHP_INT_MAX)->offset(1)->get()->map(function ($token) {    $token->revoke();});

小怪兽爱吃肉

atymic 答案不仅正确,但在某些版本的 MySQL 中,“offset”方法可能有问题,因此您可以在“handle”函数中执行此操作: Token::where('id', '!=', $event->tokenId)    ->where('user_id', $event->userId)    ->where('client_id', $event->clientId)    ->delete();
随时随地看视频慕课网APP
我要回答