Laravel 每个用户一次会话

2024-03-17

我正在尝试找出如何只允许每个用户一个会话。 因此,如果有人在已经登录其用户帐户的情况下尝试登录,第一个会话将被销毁,并将被注销以仅允许当前会话。

我正在关注这个:如何在 Laravel 中保持每个用户的单个会话 https://anupamsaha.wordpress.com/2015/09/02/how-to-keep-single-session-per-user-in-laravel/。但我不知道应该把这些代码放在哪里:

/**
 * Swap a user session with a current one
 * 
 * @param \App\User $user
 * @return boolean
 */
protected function swapUserSession($user)
{
    if (!($user instanceof \App\User)) {
        return false;
    }

    $new_session_id = Session::getId(); //get new session_id after user sign in
    $last_session = Session::getHandler()->read($user->last_session_id); // retrive last session

    if ($last_session) {
        Session::getHandler()->destroy($user->last_session_id);
    }

    $user->last_session_id = $new_session_id;
    $user->save();

    return true;
}

我目前使用的是 Laravel 5.1,所以我可以找到的唯一用于 Auth 的控制器是 AuthController.php,但它说将其放在 LoginController.php 上


如果您使用文件驱动程序,您可以将以下方法添加到 App\Http\Controllers\Auth\AuthController.php (在 Laravel 5.2 中测试)

/**
 * Only allow one concurrent session per user
 *
 * @param  Request  $request
 * @param  User  $user
 * @return Response
 */
protected function authenticated(Request $request, User $user)
{
    Session::put('user_id', $user->id);

    $files = array_diff(scandir(storage_path('framework/sessions')), array('.', '..', '.gitignore'));

    foreach ($files as $file) {
        $filepath = storage_path('framework/sessions/' . $file);
        $session = unserialize(file_get_contents($filepath));

        if ($session['user_id'] === $user->id && $session['_token'] !== Session::get('_token')) {
            unlink($filepath);
        }
    }

    return redirect()->intended($this->redirectPath());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 每个用户一次会话 的相关文章

随机推荐