我已覆盖登录和退出功能,因为我需要检查更多条件以对用户进行身份验证,如下所示。
public function login(Request $request)
{
$this->validateLogin($request);
$input=$request->all();
$user=User::where('username',$input['username'])->first();
//If Temp Password is set
if(strlen($user->temp_password)>10)
{
if (Hash::check($input['password'], $user->temp_password))
{
Auth::login($user);
$this->setUserSession($user);
$landing_page=Menu::find($user->landing_page);
return redirect()->route($landing_page->href);
}
else {
session()->put('failure','Invalid Username or Password');
return redirect('/login');
}
}
else{ //If Temp password is not set
if (Hash::check($input['password'], $user->password))
{
Auth::login($user);
$this->setUserSession($user);
$landing_page=Menu::find($user->landing_page);
return redirect()->route($landing_page->href);
}
else {
session()->put('failure','Invalid Username or Password');
return redirect('/login');
}
}
}
现在我需要在其他屏幕或地方再次限制同一用户登录。我已经检查了会话数据,但没有任何内容存储为用户的唯一。
即。如果在美国使用用户名 admin ,则不得允许同一用户名 admin 从英国登录。
答案 0 :(得分:1)
<强>更新强>
哦,巴格,问题不太清楚。您试图将会话数限制为1。如果我得到它,那么你将不得不使用database
会话驱动程序。现在,我认为您可能正在使用默认驱动程序(文件)。它仅在同一浏览器中检查会话。使用数据库会话可以允许您在任何地方检查会话,并限制连接数。
首先,确保您的路由在web
中间件内,以便他们可以访问会话。然后,在Web中间件内部,创建一组仅可供未登录用户访问的路由。
Route::group(['middleware' => 'guest'], function () {
Route::get('login', 'LoginController@login');
// any other route
});
已登录的用户将无法再访问login
路由。
您还可以在登录功能中进行检查,以查看用户是否已使用
连接if (Auth::check()) {
// user is connected
// redirect them
}
this->setUserSession($user)
做了什么?
答案 1 :(得分:1)
您可以使用登录令牌执行此操作。
生成登录令牌并将其保存在数据库中。 登录时检查数据库中的条目。 如果它不存在,请登录成功。 否则失败。
每次用户注销时都会删除登录令牌。
或
您可以在每次登录成功时生成新令牌。并删除旧令牌并使旧登录失效。
但在这种情况下,您必须将该令牌保留在会话中,并且对于每个请求,您必须使用数据库令牌检查该令牌。
如果匹配,请允许用户 否则请注意用户注意。
我个人更喜欢第二种方法。 您可以在中间件本身检查令牌。