繁体   English   中英

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

[英]Laravel: Only allowing one session per user at a time

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

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

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

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

因此,在这种情况下,您需要向用户模型添加另一个属性: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();
}

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

PS抱歉我的英文不好:)

对于执行make:auth命令后的laravel 5.2,您可以创建方法: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列添加用于更改users表的迁移。

管理解决它像这样:

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

例如: 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()]));

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

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

第一步是评论:

\\Illuminate\\Session\\Middleware\\AuthenticateSession::class,来自App\\Http Kernel.php类。

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

就这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM