Laravel 防止已登录的用户登录到其他计算机

Laravel 防止已登录的用户登录到其他计算机,laravel,laravel-5.4,laravel-authorization,Laravel,Laravel 5.4,Laravel Authorization,所以我试图阻止已经登录的用户登录到不同的浏览器或其他计算机。我想我需要增加一个IP地址限制,但我不确定这是怎么回事 这是我的创建用户表.php迁移文件 Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('username')->unique();

所以我试图阻止已经登录的用户登录到不同的浏览器或其他计算机。我想我需要增加一个IP地址限制,但我不确定这是怎么回事

这是我的创建用户表.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.php类

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

    return $next($request);
}
最佳解决方案是什么,并防止已登录的用户从另一台计算机登录?
提前感谢

解决方案是在用户登录时设置会话值。然后我让一个小班检查存储的会话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);
}

参考这一点。

从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,
就是这样,现在如果已经登录的用户再次尝试登录,那么以前登录的会话将被销毁,以前登录的用户将自动注销


这应该对你有用

你好,谢谢你这么快回答。但是,我需要在您上面编写的中间件中添加
if条件
session\u id
返回空。我接受这个答案,认为这是一种成就。但是代码不对。