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();
}
现在,如果用户有一个活动会话,并在另一个浏览器中登录,第一个会话将被删除。
P.S。抱歉我的英语不好:)
设法这样解决:
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
。
对于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 列中添加用于更改用户 table 的迁移。
这个问题很早,但是有人会通过这些简单的步骤受益。
第一步是注释掉:
\Illuminate\Session\Middleware\AuthenticateSession::class,
来自 App\Http
Kernel.php
class.
的行
其次,在登录尝试成功之后和重定向之前,将这一行添加到您的登录函数中:
\Auth::logoutOtherDevices(request('password'));
就这些了。
是否可以在 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();
}
现在,如果用户有一个活动会话,并在另一个浏览器中登录,第一个会话将被删除。
P.S。抱歉我的英语不好:)
设法这样解决:
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
。
对于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 列中添加用于更改用户 table 的迁移。
这个问题很早,但是有人会通过这些简单的步骤受益。
第一步是注释掉:
\Illuminate\Session\Middleware\AuthenticateSession::class,
来自 App\Http
Kernel.php
class.
其次,在登录尝试成功之后和重定向之前,将这一行添加到您的登录函数中:
\Auth::logoutOtherDevices(request('password'));
就这些了。