[英]Laravel one session per user
我试图弄清楚如何只允许每个用户一个会话。 因此,如果有人在他已登录其用户帐户时尝试登录,则第一个会话将被销毁并将被注销以仅允许当前会话。
我正在关注此事: 如何在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());
}
如果您正在使用5.3.15或更高版本的最新版本,我建议您查看我发布的有关此问题的以下链接。 花了我一些时间来弄清楚,但我做了,修复非常简单。
首先(假设您已经干净地安装了laravel 5.3):
获取会话表并运行 -
转到存储在config / session.php中的会话配置文件,然后向下滚动到驱动程序配置。
默认情况下,它应设置为“文件”。
将此设置更改为“数据库”。 (如果要在数据库中存储会话)
在控制台的项目目录中,执行:
php artisan session:table
php artisan migrate
然后在以下链接中向下滚动到最后一条评论,并按照步骤修复会话问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.