为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
紫衣仙女 2021-10-22 14:29:04
我使用 Laravel Passport 允许我的手机调用 laravel api 以使用 laravel 身份验证。我最近发现了一个问题,laravel 护照允许同一个用户从多个设备登录。有什么解决方案可以防止同一用户同时登录其他设备吗?我找到了一种使用 Laravel Passport 注销的方法,但如果我使用,我不知道这是否是最好的方法$request->user()->token()->revoke()每当用户尝试登录时。
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您可以挂钩该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();

});

这将删除除刚刚创建的用户令牌之外的所有用户令牌。


查看完整回答
反对 回复 2021-10-22
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

考虑到@Lucas Dalmarco 对@atymic 回答有关 MySQL“偏移”命令问题的评论。这是一个可以实施的变通解决方案。


$user = User::find($event->userId);


$user->tokens()->limit(PHP_INT_MAX)->offset(1)->get()->map(function ($token) {

    $token->revoke();

});


查看完整回答
反对 回复 2021-10-22
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

atymic 答案不仅正确,但在某些版本的 MySQL 中,“offset”方法可能有问题,因此您可以在“handle”函数中执行此操作:


 Token::where('id', '!=', $event->tokenId)

    ->where('user_id', $event->userId)

    ->where('client_id', $event->clientId)

    ->delete();


查看完整回答
反对 回复 2021-10-22
  • 3 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信