防止已经登录的用户在不同的机器上登录

Nik*_*vas 2 laravel laravel-authorization laravel-5.4

所以我试图阻止已经登录的用户在不同的浏览器或另一台计算机上登录。我想我需要添加一个 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();
});
Run Code Online (Sandbox Code Playgroud)

我还认为我需要在RedirectIfAuthenticated Middleware 类中创建一个限制。

所以,这是我的RedirectIfAuthenticated.php 类

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

    return $next($request);
}
Run Code Online (Sandbox Code Playgroud)

什么是最佳解决方案,并防止已经登录的用户从另一台计算机登录?提前致谢 !!!

Ahm*_*any 5

解决方案是在用户登录时设置会话值。然后我有一个小班级检查存储的会话ID是否与当前登录的用户相同。

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

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

$user->last_session = session_id();
$user->save();
Run Code Online (Sandbox Code Playgroud)

要检查会话是否有效,我在下面使用

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);
}
Run Code Online (Sandbox Code Playgroud)

参考此链接


muh*_*ive 5

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

在“登录控制器.php”中

app/Http/Controllers/Auth/LoginController.php

添加这个,

protected function authenticated()
{
    \Auth::logoutOtherDevices(request('password'));
}
Run Code Online (Sandbox Code Playgroud)

然后从内核,

应用程序/Http/Kernel.php

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

\Illuminate\Session\Middleware\AuthenticateSession::class,
Run Code Online (Sandbox Code Playgroud)

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

这应该对你有用。