問(wèn)題描述
當(dāng)用戶從特定設(shè)備注銷時(shí),我想從他迄今為止登錄的所有設(shè)備注銷.我如何在 Laravel 中做到這一點(diǎn).
When a user logged out from a perticular device I want to logout from all the device he has logged in till now . How I do it in Laravel.
我使用Redis通過(guò)安裝predis/predis":~1.0"
I have used Redis for keeping the userId in Session by installing "predis/predis": "~1.0"
這是我的登錄和注銷控制器:
And Here is my controller for SignIn and 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');
}
它已成功登錄并注銷,但不會(huì)終止其他設(shè)備中的所有會(huì)話.
It's successfully get logged in and also logged out but it doesn't kill all the session in other devices.
我該如何解決問(wèn)題?
推薦答案
所以問(wèn)題是 redis 鍵名輸入錯(cuò)誤,用于寫(xiě)入數(shù)據(jù)$redis->sadd('users:sessions:'.$userId,Session::getId());
其中鍵的前綴 'users:sessions:'
和用于獲取數(shù)據(jù)$redis->srem('user:sessions:' . $userId, $sessionId);
where key 的前綴 'user:sessions:'
這就是代碼不起作用并且 dd()
返回空數(shù)組的原因.
So issue was with typo in redis key name,
for write data used
$redis->sadd('users:sessions:'.$userId,Session::getId());
where key's prefix 'users:sessions:'
and for get data used
$redis->srem('user:sessions:' . $userId, $sessionId);
where key's prefix 'user:sessions:'
Thats why code didn't work and dd()
returned empty array.
正確的代碼看起來(lái)像這樣
so correct code looks like this
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');
}
這篇關(guān)于Laravel 5.2 - 如何從用戶的所有設(shè)備上注銷的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!