Возможно ли в Laravel 4 разрешить только один сеанс для каждого пользователя за раз?
Например, если пользователь входит в систему и уже имеет другие сеансы, эти другие сеансы отменены, предпочтительно с возможностью оповестить их о том, почему?
Я использую драйвер сеанса Redis на Amazon ElastiCache, если это помогает.
Да, я сделал аналогичный для моего проекта.
Итак, вам нужно добавить в свою модель пользователя другой атрибут в этом случае: last_sessid.
public function swapping($user) { $new_sessid = \Session::getId(); //get new session_id after user sign in $last_session = \Session::getHandler()->read($user->last_sessid); // retrive last session if ($last_session) { if (\Session::getHandler()->destroy($user->last_sessid)) { // session was destroyed } } $user->last_sessid = $new_sessid; $user->save(); }
Теперь, если у пользователя есть активный сеанс и знаки в другом браузере, первый сеанс будет удален.
PS Извините за мой плохой английский 🙂
Для laravel 5.2 после выполнения команды make:auth
вы можете создать метод: public function authenticated(Request $request,User $user)
в AuthController.php и в этом методе вы можете делать то, что хотите после входа в систему. Для одного сеанса для каждого пользователя мы добавляем в AuthController сверху:
use Illuminate\Http\Request; use Auth;
И добавьте функцию:
public function authenticated(Request $request,User $user){ $previous_session = $user->session_id; if ($previous_session) { \Session::getHandler()->destroy($previous_session); } Auth::user()->session_id = \Session::getId(); Auth::user()->save(); return redirect()->intended($this->redirectPath()); }
Не забудьте добавить миграцию для изменения таблицы пользователей с помощью столбца session_id.
Это удалось решить следующим образом:
Массив SessionIds в Redis (для каждого пользователя)
Пример: user.sessions.[userid] [ .... ]
в логине перед фильтром:
foreach (json_decode($redis->get('user.sessions.$userId')) as $sesId) { Session::getHandler()->destroy($sesId)); } // add session to redis $redis->set('user.sessions.$userId', json_encode([Session::getId()]));
Таким образом, вы также можете создать числовые ограничения сеанса, просто уничтожьте NumActiveSessions - MaxSessions
в Redis.