当用户从垂直设备注销时,我要从他迄今为止登录的所有设备中注销。我在Laravel中如何做。
我已经使用Redis通过安装“ predis / predis”:“〜1.0”将userId保留在Session中。
这是我用于登录和注销的控制器:
public function postSignIn(Request $request) { if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ]) ) { $redis = \Redis::connection(); $userId=Session::getId(); $redis->sadd('users:sessions:'.$userId,Session::getId()); return redirect()->route('main'); } return redirect()->back(); } public function getLogout() { $redis = Redis::connection(); $userId=Session::getId(); $userSessions = $redis->smembers('user:sessions:' . $userId); $currentSession = Session::getId(); foreach ($userSessions as $sessionId) { if ($currentSession == $sessionId) { continue; } $redis->srem('user:sessions:' . $userId, $sessionId); $redis->del('laravel:' . $sessionId); } Auth::logout(); return redirect()->route('main'); }
它已成功登录并注销,但不会终止其他设备上的所有会话。
我该如何解决这个问题?
因此,redis键名中的错字是问题,因为写数据使用的 $redis->sadd('users:sessions:'.$userId,Session::getId()); 是键的前缀'users:sessions:',而获取数据使用的 $redis->srem('user:sessions:' . $userId, $sessionId);是键的前缀,'user:sessions:' 这就是为什么代码不起作用并dd()返回空数组的原因。
$redis->sadd('users:sessions:'.$userId,Session::getId());
'users:sessions:'
$redis->srem('user:sessions:' . $userId, $sessionId);
'user:sessions:'
dd()
所以正确的代码看起来像这样
public function postSignIn(Request $request) { if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ]) ) { $redis = \Redis::connection(); $userId=Session::getId(); $redis->sadd('user:sessions:'.$userId,Session::getId()); return redirect()->route('main'); } return redirect()->back(); } public function getLogout() { $redis = Redis::connection(); $userId=Session::getId(); $userSessions = $redis->smembers('user:sessions:' . $userId); $currentSession = Session::getId(); foreach ($userSessions as $sessionId) { if ($currentSession == $sessionId) { continue; } $redis->srem('user:sessions:' . $userId, $sessionId); $redis->del('laravel:' . $sessionId); } Auth::logout(); return redirect()->route('main'); }