2015-12-13 2 views
2

Я пытаюсь выяснить, как разрешить только один сеанс для каждого пользователя. Итак, если кто-то пытается войти в систему, когда он уже вошел в свою учетную запись пользователя, первый сеанс будет уничтожен и выйдет из системы, чтобы разрешить только текущий сеанс.Laravel один сеанс на одного пользователя

Я следую за этим: How to keep single session per user in Laravel. Но я не знаю, где я должен поместить эти строки кодов:

/** 
* Swap a user session with a current one 
* 
* @param \App\User $user 
* @return boolean 
*/ 
protected function swapUserSession($user) 
{ 
    if (!($user instanceof \App\User)) { 
     return false; 
    } 

    $new_session_id = Session::getId(); //get new session_id after user sign in 
    $last_session = Session::getHandler()->read($user->last_session_id); // retrive last session 

    if ($last_session) { 
     Session::getHandler()->destroy($user->last_session_id); 
    } 

    $user->last_session_id = $new_session_id; 
    $user->save(); 

    return true; 
} 

Я в настоящее время использую Laravel 5.1, поэтому единственный контроллер я могу найти для Auth является AuthController.php, но он говорит, чтобы положить его на LoginController.php

+0

, тем не менее, даже в чистом php вам нужно было сохранить зарегистрированное состояние пользователя и где он вошел. к сожалению, я не знаю, что у laravel была такая особенность из коробки. –

ответ

0

Если вы убегаете от последнего laravel 5.3.15 или выше, я бы рекомендовал проверить следующую ссылку, которую я опубликовал по этой проблеме, с которой я столкнулся. Принял мне некоторое время, чтобы понять, но я сделал, и исправление действительно просто.

Первый (при условии, что вы установили Laravel 5.3 чисто):

Получить таблицу сессий и running-

Перейдите к файлу конфигурации сеанса хранится в конфигурационном/session.php и прокрутите вниз к водителю конфигурации.

По умолчанию он должен быть установлен в «файл».

Измените эту настройку на «базу данных». (Если вы хотите хранить сессии в базе данных)

В консоли, в директории проекта, выполнить:

php artisan session:table 

php artisan migrate 

Затем в следующей ссылке, прокрутите вниз до последнего комментария и выполните следующие действия, чтобы исправить выпуск сессии.

https://github.com/laravel/framework/issues/15821

0

Если вы используете драйвер файла, который вы можете добавить следующий метод в App \ Http \ Контроллеры \ Auth \ AuthController.php (протестировано в Laravel 5.2)

/** 
* Only allow one concurrent session per user 
* 
* @param Request $request 
* @param User $user 
* @return Response 
*/ 
protected function authenticated(Request $request, User $user) 
{ 
    Session::put('user_id', $user->id); 

    $files = array_diff(scandir(storage_path('framework/sessions')), array('.', '..', '.gitignore')); 

    foreach ($files as $file) { 
     $filepath = storage_path('framework/sessions/' . $file); 
     $session = unserialize(file_get_contents($filepath)); 

     if ($session['user_id'] === $user->id && $session['_token'] !== Session::get('_token')) { 
      unlink($filepath); 
     } 
    } 

    return redirect()->intended($this->redirectPath()); 
} 
Смежные вопросы