我正在构建一个laravel应用程序,其中一个用户登录了其他设备并且在注销时我想强迫他从其他设备注销。我如何在laravel中实现。
我个人使用过Redis Server。在运行程序时,我也运行了redis-server.exe
。我在Windows中。
我已使用CACHE_DRIVER=redis SESSION_DRIVER=redis
更改了.env文件
除了已经安装了laravel的Redis之外,我还安装了"predis/predis": "~1.0"
这是我的控制器,我已经编写了登录信息,强制用户从其他设备注销。
在Signin控制器中,当我dd()$redis
时,我看到为该用户创建的会话,但是当我登录并且何时注销时,我dd()$userSessions
但是看到空,所以它表示没有存储在会话表中以进行比较。
如果有人找到任何解决方案,请帮助我找到它。在此先感谢。
控制器:
public function postSignIn(Request $request)
{
if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ]) ) {
$redis = \Redis::connection();
$userId = Auth::user()->id;
$redis->sadd('users:sessions:' . $userId,Session::getId());
return redirect()->route('main');
}
return redirect()->back();
}
public function getLogout()
{
$redis = Redis::connection();
$userId =Auth::user()->id;
$userSessions = $redis->smembers('user:sessions:' . $userId);
$redis->sadd('users:sessions:'.$userId,Session::getId());
$currentSession = Session::getId();
foreach ($userSessions as $sessionId) {
if ($currentSession == $sessionId) {
continue;
}
$redis->srem('user:sessions:' . $userId, $sessionId);
$redis->del('laravel:' . $sessionId);
\Session::setId( $sessionId );
\Session::clear();
}
Auth::logout();
return redirect()->route('main');
}
答案 0 :(得分:0)
将Redis与Laravel一起使用您可以像这样使用:
// During LogIn
Cache::tags(['sessions', auth()->id])->forever('session:'.auth()->id, Session::getId());
// Logout
Cache::tags([auth()->id])->flush();
标签允许您删除存储在具体标签中的所有密钥。
<强> [更新] 强>
您必须适合会话变量名称。
public function postSignIn(Request $request)
{
if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ]) ) {
$userId = Auth::user()->id;
\Cache::tags(['sessions', 'session_'.$userId])->forever('users:sessions:' . $userId, Session::getId());
return redirect()->route('main');
}
return redirect()->back();
}
public function getLogout()
{
$userId =Auth::user()->id;
$sessionId = \Cache::get('users:sessions:' . $userId);
\Cache::tags(['session_'.$userId])->flush();
\Session::setId( $sessionId );
\Session::clear();
Auth::logout();
return redirect()->route('main');
}