FQuijada Asked: 2020-03-21 05:31:50 +0800 CST 2020-03-21 05:31:50 +0800 CST 2020-03-21 05:31:50 +0800 CST Laravel 中每个用户只有一个活动会话 772 如何限制用户一次只能登录系统?我使用的是 Laravel 默认自带的认证系统。如果您尝试第二次登录,则应关闭前一个。 laravel 2 Answers Voted Best Answer FQuijada 2020-03-22T10:17:49+08:002020-03-22T10:17:49+08:00 经过调查后,我发现 laravel 5.5 这个 **解决方案** 1.复制sendLoginResponse文件功能: 供应商/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php 并将其粘贴到文件中 应用程序/Htpp/Controllers/Auth/LoginController.php 这将覆盖默认函数sendLoginResponse,(您不应该直接在供应商文件夹中的文件上执行此操作,因为执行作曲家更新会丢失您的更改)。 2.通过向名为 users 的表中添加一个文本类型字段来更新您的数据库: session_id . 3 . sendLoginResponse像这样将您复制的功能保留在 LoginController 中 protected function sendLoginResponse(Request $request) { $request->session()->regenerate(); $previous_session = Auth::User()->session_id; if ($previous_session) { \Session::getHandler()->destroy($previous_session); } Auth::user()->session_id = \Session::getId(); Auth::user()->save(); $this->clearLoginAttempts($request); return $this->authenticated($request, $this->guard()->user()) ?: redirect()->intended($this->redirectPath()); } //No olvide colocar en el inicio del archivo: // use Auth; // use Illuminate\Http\Request; // use Session; Alberto Ortega 2020-12-29T09:15:26+08:002020-12-29T09:15:26+08:00 Laravel 已经对此提供了支持。 根据要求,我将重复文件中清楚说明的内容。首先将 laravel 更新到最新版本或高于 5.6 这很简单,您只需为此更新第 13 行的 composer.json 即可。 "laravel/framework": "5.7.*", 然后在你的控制台中执行命令 composer updated 更新项目后,您应该转到 midelwares 内核并取消注释该行。 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, "Esta" \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 取消注释后,您必须在 auth fakade 中添加以下行(显然是您登录的位置或您要求每个用户的会话是唯一的)。 use Illuminate\Support\Facades\Auth; // extensión del fakade Auth::logoutOtherDevices($password); 显然,在此之前,您必须拥有可用的用户密码。一个非常实际的例子是 Laravel 的正常登录。在登录构造函数中 public function __construct() { $this->middleware('guest')->except('logout'); if(Auth::check()){ Auth::logoutOtherDevices($request->input('password')); } } 在任何其他用例中也是如此。 https://laravel.com/docs/5.6/authentication#invalidating-sessions-on-other-devices
经过调查后,我发现 laravel 5.5 这个
**解决方案**
1.复制
sendLoginResponse
文件功能:并将其粘贴到文件中
这将覆盖默认函数
sendLoginResponse
,(您不应该直接在供应商文件夹中的文件上执行此操作,因为执行作曲家更新会丢失您的更改)。2.通过向名为 users 的表中添加一个文本类型字段来更新您的数据库:
.
3 .
sendLoginResponse
像这样将您复制的功能保留在 LoginController 中Laravel 已经对此提供了支持。
根据要求,我将重复文件中清楚说明的内容。首先将 laravel 更新到最新版本或高于 5.6 这很简单,您只需为此更新第 13 行的 composer.json 即可。
然后在你的控制台中执行命令
更新项目后,您应该转到 midelwares 内核并取消注释该行。
取消注释后,您必须在 auth fakade 中添加以下行(显然是您登录的位置或您要求每个用户的会话是唯一的)。
显然,在此之前,您必须拥有可用的用户密码。一个非常实际的例子是 Laravel 的正常登录。在登录构造函数中
在任何其他用例中也是如此。
https://laravel.com/docs/5.6/authentication#invalidating-sessions-on-other-devices