Laravel: позволяет только один сеанс на пользователя одновременно

Возможно ли в Laravel 4 разрешить только один сеанс для каждого пользователя за раз?

Например, если пользователь входит в систему и уже имеет другие сеансы, эти другие сеансы отменены, предпочтительно с возможностью оповестить их о том, почему?

Я использую драйвер сеанса Redis на Amazon ElastiCache, если это помогает.

Related of "Laravel: позволяет только один сеанс на пользователя одновременно"

Да, я сделал аналогичный для моего проекта.

Итак, вам нужно добавить в свою модель пользователя другой атрибут в этом случае: 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.