当用户从特定设备注销时,我想从他登录的所有设备注销到现在为止.我是怎么在Laravel做的.
我使用Redis通过安装“predis / predis”来保持userId在Session中:“~1.0”
这是我的SignIn和logout控制器:
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->萨德( ‘用户:会话:’ $用户id,会议::的getId());
其中key的前缀为’users:sessions:’,用于获取数据
$redis-> srem(‘user:sessions:’.$userId,$sessionId); key的前缀’user:sessions:’
这就是为什么代码不起作用而dd()返回空数组.
用于写入数据
$redis->萨德( ‘用户:会话:’ $用户id,会议::的getId());
其中key的前缀为’users:sessions:’,用于获取数据
$redis-> srem(‘user:sessions:’.$userId,$sessionId); key的前缀’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'); }