Запретить уже вошедшему в систему пользователю входить в систему на другой машине

Поэтому я пытаюсь запретить уже зарегистрированному пользователю входить в систему в другом браузере или на другом компьютере. Я думаю, что мне нужно добавить ограничение IP-адреса, но я не уверен, как это будет работать.

Вот мой файл миграции create_users_table.php

Schema::create('users', function (Blueprint $table) {
     $table->increments('id');
     $table->string('name');
     $table->string('username')->unique();
     $table->string('email')->unique();
     $table->string('password');
     $table->timestamp('last_login');
     $table->boolean('isActive')->default(true);
     $table->rememberToken();
     $table->timestamps();
});

Я также думаю, что мне нужно создать ограничение внутри класса промежуточного программного обеспечения RedirectIfAuthenticated.

Итак, вот мой класс RedirectIfAuthenticated.php

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
         return redirect('/');
    }

    return $next($request);
}

Каково оптимальное решение для этого и предотвратить вход уже вошедшего в систему пользователя с другого компьютера? Заранее спасибо !!!


person diakosavvasn    schedule 28.11.2018    source источник


Ответы (2)


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

Если пользователь входит в систему откуда-то еще, идентификатор сеанса в БД будет обновлен, и «старый» пользователь выйдет из системы.

Я не изменил драйвер аутентификации или что-то еще, просто поместил его поверх, когда пользователь входит в систему. Ниже происходит, когда вход в систему успешен:

$user->last_session = session_id();
$user->save();

Чтобы проверить, действителен ли сеанс, я использовал ниже

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
      if(session_id() != Auth::user()->last_session){
        Auth::logout();
        return redirect('login');
      }

     return redirect('/');

    }

    return $next($request);
}

Ссылка на эту ссылку.

person Ahmad Elkenany    schedule 28.11.2018
comment
Здравствуйте, спасибо, что так быстро ответили. Но куда мне нужно добавить if condition, что вы написали выше??? - person diakosavvasn; 28.11.2018
comment
в вашем промежуточном программном обеспечении внутри, если проверка подлинности - person Ahmad Elkenany; 28.11.2018
comment
Прежде всего, я не могу сохранить сеанс для пользователя. session_id возвращает пустое значение. - person diakosavvasn; 30.11.2018
comment
Я принимаю ответ как идею этого достижения. Но код не тот. - person diakosavvasn; 30.11.2018

Начиная с Laravel 5.6 вам не нужно создавать какие-либо таблицы базы данных или подобные вещи.

в «Логинконтроллер.php»

приложение/Http/Контроллеры/Auth/LoginController.php

Добавь это,

protected function authenticated()
{
    \Auth::logoutOtherDevices(request('password'));
}

Затем из ядра,

приложение/Http/Kernel.php

в разделах protected $middlewareGroups удалите комментарий из этой строки, если он уже существует, или просто добавьте эту строку -

\Illuminate\Session\Middleware\AuthenticateSession::class,

Вот и все, теперь, если уже вошедший в систему пользователь попытается снова войти в систему, то предыдущий вход в систему будет уничтожен, а предыдущий вошедший в систему пользователь автоматически выйдет из системы.

Это должно сработать для вас.

person muhive    schedule 16.04.2019