所以我试图阻止已经登录的用户登录不同的浏览器或其他计算机。我想我需要添加一个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 Middleware类中创建一个限制。
所以,这是我的RedirectIfAuthenticated.php类
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/');
}
return $next($request);
}
什么是最佳解决方案,并防止已登录的用户从另一台计算机登录?提前致谢 !!!
解决方案是在用户登录时设置会话值。然后我有一个小类检查存储的会话ID是否与登录的当前用户相同。
如果用户从其他位置登录,则DB中的会话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。
从Laravel 5.6您不需要创建任何数据库表或类似的东西。
在'LoginController.php'中
应用程序/ HTTP /控制器/认证/ LoginController.php
加上这个,
protected function authenticated()
{
\Auth::logoutOtherDevices(request('password'));
}
然后从内核,
应用程序/ HTTP / Kernel.php
在受保护的$ middlewareGroups部分中,如果已存在,则从此行中删除注释或仅添加此行 -
\Illuminate\Session\Middleware\AuthenticateSession::class,
多数民众赞成,现在如果已经登录的用户尝试再次登录,那么先前登录的会话将被销毁,之前登录的用户将自动注销。
这应该适合你。