Laravel:每个用户一次只允许一个会话

     2023-02-24     123

关键词:

【中文标题】Laravel:每个用户一次只允许一个会话【英文标题】:Laravel: Only allowing one session per user at a time 【发布时间】:2015-03-12 08:32:36 【问题描述】:

在 Laravel 4 中是否可以一次只允许每个用户一个会话?

例如,如果用户登录并且已经有其他会话,那么那些其他会话将被取消,最好是通过某种方式提醒他们为什么?

如果有帮助的话,我正在 Amazon ElastiCache 上使用 Redis 会话驱动程序。

【问题讨论】:

一次只能激活一个会话,只能将不同的数据同时进行多个“会话”。 什么意思?在 Laravel 4 中,默认情况下,一个用户可以在不同的机器上使用同一个帐户多次登录,并且所有这些会话都将有效。我想这样做,一旦他们登录,附加到他们的 UserId 的所有其他会话都将被取消。 好的,我现在明白了,但要解决这个问题,您需要查询会话驱动程序以获取连接到给定用户的所有会话并删除它们。通常我会把它放在一个数据库中,然后删除其他的,但在你的情况下,我不知道解决方案。 【参考方案1】:

是的,我为我的项目做了类似的事情。

因此,在这种情况下,您需要向用户模型添加另一个属性:last_sessid。

public function swapping($user) 
    $new_sessid   = \Session::getId(); //get new session_id after user sign in
    $last_session = \Session::getHandler()->read($user->last_sessid); // retrive last session

    if ($last_session) 
        if (\Session::getHandler()->destroy($user->last_sessid)) 
            // session was destroyed
        
    

    $user->last_sessid = $new_sessid;
    $user->save();

现在,如果用户有一个活动会话,并在另一个浏览器中登录,第一个会话将被删除。

附:对不起我的英语不好:)

【讨论】:

不就是会话再生吗?如果他在GMail中遇到问题,您可以在5台机器上登录而他想在其他4台机器上注销用户?我认为你的代码并没有解决他的问题。 例如:您登录 chrome,然后打开 firefox 并登录,然后,当您返回 chrome 并尝试仅对登录用户执行需要权限的操作时,您的身份验证过滤器将抛出异常, 或重定向错误等...对我来说,这段代码完美地工作 1 个用户 - 1 个会话 但它禁止用户同时在多个地方登录,然后只能选择从所有其他地方注销。 如果我理解正确的话,是的,你不能选择删除哪个会话,但是如果你想选择,你应该保存用户的所有 session_id... 我怎样才能做到这一点,但只有 2 次会话并且不允许登录到第 3 次会话。【参考方案2】:

对于 laravel 5.2,在执行 make:auth 命令后,您可以在 AuthController.php 中创建方法:public function authenticated(Request $request,User $user),在该方法中您可以在登录后做您想做的事情。 对于每个用户的单个会话,我们添加到顶部的 AuthController:

use Illuminate\Http\Request;
use Auth;

并添加功能:

public function authenticated(Request $request,User $user)
    $previous_session = $user->session_id;

    if ($previous_session) 
        \Session::getHandler()->destroy($previous_session);
    

    Auth::user()->session_id = \Session::getId();
    Auth::user()->save();
    return redirect()->intended($this->redirectPath());

记得添加迁移以使用 session_id 列更改用户表。

【讨论】:

【参考方案3】:

设法像这样解决它:

Redis 中的 SessionId 数组(每个用户)

示例:user.sessions.[userid] [ .... ]

在过滤前登录:

foreach (json_decode($redis->get('user.sessions.$userId')) as $sesId) 
   Session::getHandler()->destroy($sesId));


// add session to redis
$redis->set('user.sessions.$userId', json_encode([Session::getId()]));

这样你还可以创建一个数字会话限制,只需在 Redis 中销毁 NumActiveSessions - MaxSessions

【讨论】:

【参考方案4】:

这个问题要早得多,但有人会通过这些简单的步骤受益。

第一步是注释掉:

\Illuminate\Session\Middleware\AuthenticateSession::class, 来自App\HttpKernel.php 类的行。

在登录尝试成功之后和重定向之前,在您的登录函数中再次添加此行: \Auth::logoutOtherDevices(request('password'));

就是这样。

【讨论】:

一次只允许播放一个音频元素

...1-1617:20:56【问题描述】:我有一页上有多个音频播放器,每个播放器都有一个播放和停止按钮。我遇到的唯一问题是,当您单击一个播放按钮,然后单击另一个播放按钮时,它们会相互叠加播放。有人可以帮我编写代码,当单击... 查看详情

一次只允许一个客户

】一次只允许一个客户【英文标题】:Allowonlyasingleclientatatime【发布时间】:2017-02-2605:32:57【问题描述】:我现在在WCF编码,问题很标准:我需要我的WCF服务器来管理硬件设备,因此我非常需要一次只允许1个客户端。我确实尝试... 查看详情

Laravel 中的单会话登录

】Laravel中的单会话登录【英文标题】:SingleSessionLogininLaravel【发布时间】:2013-10-3020:55:30【问题描述】:我正在尝试实施一项用户策略,即一次只能有一个用户登录。我正在尝试在Laravel的Auth驱动程序之上构建它。我曾想过使用... 查看详情

每个用户只允许一个会话(代码片段)

我们有一个使用struts2,spring和hibernate开发的web应用程序。该应用程序需要一个用户只能从一个浏览器登录的功能。假如用户x,登录到pc-1浏览器ff,那么他就无法从任何其他地方登录。我通过实现会话映射尝试了它并将会话存储... 查看详情

java示例代码_允许一次只运行一个Java程序实例

java示例代码_允许一次只运行一个Java程序实例 查看详情

允许每个用户的单个会话 IdentityServer4

】允许每个用户的单个会话IdentityServer4【英文标题】:AllowsinglesessionperuserIdentityServer4【发布时间】:2021-06-1618:40:47【问题描述】:使用IdentityServer4,我每次需要允许一个用户会话。如果用户使用设备A进行身份验证,然后使用B进... 查看详情

GitLab Runner - 如何一次只允许一个管道运行

】GitLabRunner-如何一次只允许一个管道运行【英文标题】:GitLabRunner-HowtoallowonlyonePipelinerunatatime【发布时间】:2020-07-1221:12:26【问题描述】:我是GitLab的新手,遇到一个问题,如果我在同一个gitlab-runner上同时触发两个管道,它们... 查看详情

如何让用户一次只从一台设备登录

】如何让用户一次只从一台设备登录【英文标题】:Howtomakeuserloginfromonlyonedeviceatatime【发布时间】:2015-11-1500:01:26【问题描述】:我有一个RestAPI,当点击验证用户时。此api暴露给android和ios开发人员,他们点击此api以允许用户登... 查看详情

Laravel - 创建一个会话数组并在每次重新加载页面时添加到它

】Laravel-创建一个会话数组并在每次重新加载页面时添加到它【英文标题】:Laravel-Createasessionarrayandaddtoiteverytimethepageisreloaded【发布时间】:2019-07-1810:40:30【问题描述】:在何处以及如何实例化会话数组,如何添加到该会话数组... 查看详情

设计限制每个用户一次会话

】设计限制每个用户一次会话【英文标题】:Deviselimitonesessionperuseratatime【发布时间】:2011-10-2711:44:55【问题描述】:我的应用正在使用Rails3.0.4和Devise1.1.7。我正在寻找一种方法来阻止用户共享帐户,因为该应用是基于订阅的服... 查看详情

如何在 laravel 中进行会话?

】如何在laravel中进行会话?【英文标题】:howtomakeasessioninlaravel?【发布时间】:2018-01-2902:51:20【问题描述】:我想根据$id(唯一id)创建会话。这是为了当每个用户进入Web应用程序时,他们将拥有自己的会话ID和自己的数组。但... 查看详情

ejb和同步

...是实例值而没有同步问题的原因。另一答案无状态bean:每个线程/请求都将从池中获取不同的EJB实例。SLB不应该保存任何用户会话数据,任何状态。可以并行执行相同的代码。一个线程一次访问一个实例。为用户会话同步Statefullb... 查看详情

限制每个用户的并发 wcf 会话数

】限制每个用户的并发wcf会话数【英文标题】:Restrictnumberofconcurrentwcfsessionsperuser【发布时间】:2011-06-2419:55:02【问题描述】:我有一个基于会话且安全的WCF服务(可能会使用联合安全性)。我希望每个用户只允许1个并发会话。... 查看详情

Laravel 为每个请求创建一个新会话

】Laravel为每个请求创建一个新会话【英文标题】:Laravelcreatesanewsessiononeveryrequest【发布时间】:2016-08-0722:53:26【问题描述】:由于某种原因,我无法确定我的Laravel安装已开始为每个请求创建一个新的会话文件!这会使会话无用... 查看详情

折叠插件:一次只显示一个面板

】折叠插件:一次只显示一个面板【英文标题】:Collapseplugin:Onlyshowonepanelatatime【发布时间】:2013-03-0421:31:14【问题描述】:我很难弄清楚这一点,也许我只是没有搜索正确的术语。我有一个常规的twitter折叠面板。我只希望它一... 查看详情

每个用户/浏览器会话仅显示一次欢迎 div

】每个用户/浏览器会话仅显示一次欢迎div【英文标题】:Showwelcomedivonlyonceperuser/browsersession【发布时间】:2013-04-2714:02:23【问题描述】:我只想为每个用户或会话显示一次欢迎div。我知道有Jquery选项。由于是jquery的新手,我自己... 查看详情

没有 cookie 的 Laravel 会话

】没有cookie的Laravel会话【英文标题】:Laravelsessionswithoutcookies【发布时间】:2016-07-0204:16:54【问题描述】:我有一个允许用户登录并将商品添加到购物篮的应用程序,但是如果用户关闭了cookie,此功能将不再起作用。我检查了fac... 查看详情

如何在 Laravel 中将每个用户的数据库字段更新限制为 24 小时一次

】如何在Laravel中将每个用户的数据库字段更新限制为24小时一次【英文标题】:HowdoIlimitadatabasefieldupdatetooncein24hrsperuserinLaravel【发布时间】:2021-08-1223:41:37【问题描述】:我创建了一个API,可以在用户登录时在LoginActivity表上记... 查看详情