Php Larvel每个用户一个会话
我正在尝试找出如何只允许每个用户使用一个会话。 因此,如果有人试图在已登录其用户帐户的情况下登录,则第一个会话将被销毁,并将被注销以仅允许当前会话 我正在关注这个:。但我不知道我应该把这些代码放在哪里:Php Larvel每个用户一个会话,php,laravel,session,laravel-5.1,Php,Laravel,Session,Laravel 5.1,我正在尝试找出如何只允许每个用户使用一个会话。 因此,如果有人试图在已登录其用户帐户的情况下登录,则第一个会话将被销毁,并将被注销以仅允许当前会话 我正在关注这个:。但我不知道我应该把这些代码放在哪里: /** * Swap a user session with a current one * * @param \App\User $user * @return boolean */ protected function swapUserSession($user) { i
/**
* 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上。如果您使用的是最新的Laravel 5.3.15或更高版本,我建议您查看我发布的关于我遇到的这个问题的以下链接。我花了一些时间才弄明白,但我确实弄明白了,而且解决方法非常简单 首先(假设您已干净地安装了laravel 5.3): 启动并运行会话表- 转到存储在config/session.php中的会话配置文件,并向下滚动到驱动程序配置 默认情况下,它应设置为“文件” 将此设置更改为“数据库”。(前提是要在数据库中存储会话) 在控制台的项目目录中,执行以下操作:
php artisan session:table
php artisan migrate
然后在下面的链接中向下滚动到最后一条评论,并按照步骤修复会话问题
如果使用文件驱动程序,可以将以下方法添加到App\Http\Controllers\Auth\AuthController.php(在Laravel 5.2中测试)
尽管如此,即使在纯php中,您也必须存储用户的登录状态和登录位置。不幸的是,我不知道laravel有这种开箱即用的功能。
/**
* 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());
}