Laravel:注销特定用户

Posted

技术标签:

【中文标题】Laravel:注销特定用户【英文标题】:Laravel: log specific user out 【发布时间】:2016-08-22 01:48:29 【问题描述】:

我有一个基于角色的 Laravel 应用程序。我有管理员角色并试图阻止特定用户,然后立即将用户从应用程序中注销。 所以使用Auth::logout() 情况并非如此,因为它注销了自己而不是预期的用户!

【问题讨论】:

你必须以某种方式清除他们的会话。您使用的是什么会话存储? 如果他们选中了“记住我”框,您可能还必须清除他们在users 表中的remember_me 令牌,这样他们就不会立即重新登录。 如果您切换到数据库驱动程序,它会存储一个user_id 字段,因此您可以简单地使用delete from sessions where user_id = $id 我同意切换到数据库驱动程序,使用文件会话驱动程序时有some issues noticed,如果用户即使在登录后仍然可以执行ajax 请求,这可能会影响您的情况出去。上面同样的问题让我困扰了几天。 正如 ceejayoz 所说,您还需要删除 users 表中的 remember_me 令牌,否则客户端上的 cookie 将识别用户并创建新会话。 【参考方案1】:

这里的每个人都建议您只删除用户会话,但我认为这是一个坏建议,因为会话可能包含您不想删除的信息。删除会话只是为了注销用户,就像用火箭筒杀死苍蝇一样。

更优雅的解决方案是将用户标记为注销并检查是否在每个请求上都标记了用户。如果他被标记了,只需使用简单的Auth::logout()立即注销他

您可以通过单击我的answer to similar question 的链接找到代码示例。

更新 - 测试

好吧,伙计们,你们对我投了反对票,让我觉得自己像个傻瓜,所以我决定测试一下。

我已将会话驱动程序切换到数据库。

然后我用session->put('mes', 'I\'m here!'); 制作了一条路线并运行它。之后我使用echo session->get('mes'); 进行操作,所以我看到了消息。

之后,我尝试关闭浏览器并再次打开它。我已使用Auth::logout(); 注销,然后登录。我仍然看到该消息。会话被保留。

现在,当我使用@Ben Swinburne 方法手动删除会话时,消息消失了。整个会话被破坏。

所以,我想这证明我的答案是正确的。

另外,看看this lukasgeiter 的回答。

【讨论】:

删除会话与删除会话的Auth::logout() 函数没有什么不同。 @AlexeyMezenin Illuminate\Auth\SessionGuard,见logout() 调用clearUserDataFromStorage()。它会擦除该会话的数据并清理 cookie 并记住令牌。 @AlexeyMezenin 当然可以。 Illuminate/Auth/Guard。亚历克斯,您的答案可能位于此文件中。可以玩Auth::setUser() 或其他东西。我不知道。目前无法测试。 搜索最近安装的Illuminate/Auth/Guard。而且我并不是说杀死所有用户会话。只需登录一个。 @AlexeyMezenin 确实如此;迈克巴维克是正确的。看看我上面的评论。

以上是关于Laravel:注销特定用户的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中通过用户 ID 强制注销特定用户

如何从 Laravel 的特定会话中注销用户?

在 laravel 护照中注销用户

Laravel 注销不同的用户

Laravel 认证用户注销错误

如果删除状态,Laravel 强制用户注销