阻止已登录的用户登录其他计算机

时间:2018-11-28 12:46:46

标签: laravel laravel-5.4 laravel-authorization

因此,我正在尝试阻止已登录的用户在其他浏览器或另一台计算机上登录。我以为我需要添加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);
}

什么是最佳解决方案,并且防止已经登录的用户从另一台计算机登录? 在此先感谢!!!

2 个答案:

答案 0 :(得分:3)

解决方案是在用户登录时设置会话值。然后,我进行了一个小类检查所存储的会话ID是否与当前登录的用户相同。

如果用户从其他地方登录,则数据库中的会话ID将更新,并且“较旧”的用户将注销。

我没有更改Auth驱动程序或其他任何东西,只是在用户登录时将其放在顶部。登录成功后会发生以下情况:

$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);
}

参考此Link

答案 1 :(得分:1)

从Laravel 5.6开始,您无需创建任何数据库表或类似的东西。

在“ LoginController.php”中

  

app / Http / Controllers / Auth / LoginController.php

添加此内容

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

然后从内核,

  

app / Http / Kernel.php

在受受保护的$ middlewareGroups 部分中,从该行中删除注释(如果已有的话),或仅添加此行-

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

就是这样,现在,如果已经登录的用户尝试再次登录,则先前登录的会话将被破坏,并且先前登录的用户将被自动注销。

这应该为您工作。

相关问题