Laravel 5.5限制重复登录

时间:2017-10-30 08:27:46

标签: laravel

我已覆盖登录退出功能,因为我需要检查更多条件以对用户进行身份验证,如下所示。

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 从英国登录。

2 个答案:

答案 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)

您可以使用登录令牌执行此操作。

生成登录令牌并将其保存在数据库中。 登录时检查数据库中的条目。 如果它不存在,请登录成功。 否则失败。

每次用户注销时都会删除登录令牌。

您可以在每次登录成功时生成新令牌。并删除旧令牌并使旧登录失效。

但在这种情况下,您必须将该令牌保留在会话中,并且对于每个请求,您必须使用数据库令牌检查该令牌。

如果匹配,请允许用户 否则请注意用户注意。

我个人更喜欢第二种方法。 您可以在中间件本身检查令牌。