Laravel 5.2 – Как выйти из системы на всех его устройствах

Когда пользователь выходил из суточного устройства, я хочу выйти из всех устройств, которые он зарегистрировал до сих пор. Как я это делаю в Ларавеле.

Я использовал Redis для сохранения userId в сеансе, установив «predis / predis»: «~ 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'); } 

Он успешно войдет в систему и также выйдет из системы, но не убивает весь сеанс на других устройствах.

Как решить проблему?

Related of "Laravel 5.2 – Как выйти из системы на всех его устройствах"

Таким образом, проблема заключалась в опечатке в ключевом ключе redis, для записи данных использовались $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'); } из 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'); } 

У меня есть предложение / обходное решение для вашей проблемы:

Работа с сеансами, которые не хранятся в базе данных, является болью в **, поэтому вам нужно думать по-другому, чтобы решить проблему. Другим решением будет запись идентификатора пользователя и времени при выходе пользователя из системы. Затем создайте промежуточное программное обеспечение, которое отключит пользователя, если соединение старше последней даты выхода. И это все.


Мой прототип будет выглядеть так:
В postSignIn метода postSignIn ниже будет postSignIn дата входа пользователя (сеанса): app('request')->session()->put('login_date', time());

В getLogout метода getLogout ниже будет записываться дата выхода пользователя в глобальном масштабе: \Cache::put('last_logout_'.\Auth::id(), time());

И последнее касание было бы промежуточным программным кодом с кодом, подобным этому:

 if ($user = \Auth::user()) { $login_date = app('request')->session()->get('login_date'); $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); if ($login_date < $last_logout_date) { \Auth::logout(); //redirect, error message... } } из if ($user = \Auth::user()) { $login_date = app('request')->session()->get('login_date'); $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); if ($login_date < $last_logout_date) { \Auth::logout(); //redirect, error message... } } 

Полный код:

Методы:

 public function postSignIn(Request $request) { if (Auth::attempt(['email' => $request['email'], 'password' => $request['password']])) { app('request')->session()->put('login_date', time()); return redirect()->route('main'); } return redirect()->back(); } public function getLogout() { \Cache::put('last_logout_' . \Auth::id(), time()); Auth::logout(); return redirect()->route('main'); } из public function postSignIn(Request $request) { if (Auth::attempt(['email' => $request['email'], 'password' => $request['password']])) { app('request')->session()->put('login_date', time()); return redirect()->route('main'); } return redirect()->back(); } public function getLogout() { \Cache::put('last_logout_' . \Auth::id(), time()); Auth::logout(); return redirect()->route('main'); } 

Middleware:

 <?php namespace App\Http\Middleware; use Closure; class LogoutIfExpired { public function handle($request, Closure $next, $guard = null) { if ($user = \Auth::user()) { $login_date = app('request')->session()->get('login_date'); $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); if ($login_date < $last_logout_date) { \Auth::logout(); return redirect()->route('main'); } } return $next($request); } } из <?php namespace App\Http\Middleware; use Closure; class LogoutIfExpired { public function handle($request, Closure $next, $guard = null) { if ($user = \Auth::user()) { $login_date = app('request')->session()->get('login_date'); $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); if ($login_date < $last_logout_date) { \Auth::logout(); return redirect()->route('main'); } } return $next($request); } }