带有重试次数

时间:2018-01-29 15:52:29

标签: php mysql laravel authentication eloquent

我正在使用php laravel为我的管理控制台创建身份验证(具有eloquent的默认身份验证方法)。

为此,我有两个表,其中一个用于存储基本用户详细信息,如用户名,密码,名称,重试次数,状态等。另一个用户角色映射。

我想要实现的目标

  1. 每当用户尝试登录时,我都需要检查
    • 用户的状态是否有效(状态= 1)
    • 重试次数是否小于5(retry_count< 5)
  2.   

    块引用   这是我尝试运行身份验证的SQL查询

    SELECT * FROM users WHERE username = '' AND password = '' AND status = 1 AND retry_count < 3;
    
    1. 如果登录失败,

      • 对于#1
      • 中的案例,需要分别使用正确的错误消息重定向到登录页面,例如“用户帐户未激活”或“用户帐户已被阻止”
      • 增加数据库中的retry_count
    2. 用户成功通过身份验证后,

      • 我需要将角色表中的所有细节存储到会话中,以便我可以在必要时使用它进行验证。
      • 将retry_count重置为零
    3. 退出时,清除所有会话
    4. CREATE TABLE `users` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `username` varchar(25) CHARACTER SET utf8 NOT NULL UNIQUE,
        `password` varchar(255) CHARACTER SET utf8 NOT NULL,
        `name` varchar(255) CHARACTER SET utf8 NOT NULL,
        `status` int(11) NOT NULL,
        `retry_count` int(11) NOT NULL DEFAULT '0',
        PRIMARY KEY (`id`)
      );  
      
      CREATE TABLE `user_role_mapping` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `user_id` int(11) NOT NULL,
        `role_id` int(11) NOT NULL,
        `status` int(11) NOT NULL,
        PRIMARY KEY (`id`)
      );
      
        

      块引用   user_role_mapping.user_id是users.id的外键。而user_role_mapping可以为同一个用户提供多行。

      我已经完成了如下登录身份验证的基础知识,它可以正常工作。但是我为了达到上述4个用例而被困在这里。

      public function submitLogin(Request $request)
      {
          $this->validate($request, [
              'username'=>'required|max:50',
              'password'=>'required|max:100',
          ]);
      
          if (Auth::attempt(['username' => $request->username, 'password' => $request->password, 'status' => 1])) {
      
              //return [Auth::user() , Auth::id()];
              return redirect()->intended(route('home'));
          }
      
          return redirect()->back()
              ->withInput($request->only('username', 'remember'))
              ->withErrors([
                  'Invalid Username or password.',
              ]);
      }
      

      提前致谢..

1 个答案:

答案 0 :(得分:0)

请查看有关额外字段验证的post

&#34;重试次数&#34;包含在laravel中,检查ThrottlesLogins.php,它处理重试计数并清除成功的计数。

如果登录失败。查看官方doc有关错误消息的信息。你可以用刀片这样做:

<input type="email" name="email" value="{{ old('email') }}" required>

@if ($errors->has('email'))
    <span class="help-block">
        <strong>{{ $errors->first('email') }}</strong>
    </span>
@endif

Laravel会将电子邮件的错误覆盖到&#34;登录尝试次数过多。请在XX秒后再试一次。&#34;如果尝试次数太多(默认为5),则显示消息。

在AuthenticateUsers.php中验证的函数中对用户进行身份验证后,您可以实现自己的操作(例如:向会话添加更多信息)(名称约定基于laravel 5.5,不检查名称是否为与以前的版本不同。)

**对于已登录用户的角色更改,请注意安全问题。

/**
 * The user has been authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    //below is an exmaple
    $u = User::with('roles')->find($user->id);
    if(isset($u->roles)) {
        foreach($u->roles as $role) {
            session()->put('user.roles.'$role, true);
        }
    }  
} 

由于laravel为已注销用户清除(无效)所有会话,因此您的第4个问题并不重要。您可以在AuthenticateUsers.php

中查看功能注销
public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->invalidate();

    return redirect('/');
}

更新:来自所有IP的帐户的节流

如登录功能中所述,Laravel使用用户名和IP来键入缓存和值以进行计数。所以,乍一看我会说你正在寻找ThrottlesLogins.php中的函数throttleKey。

protected function throttleKey(Request $request)
{
    return Str::lower($request->input($this->username())).'|'.$request->ip();
}

带走。&#39; |&#39;。$ request-&gt; ip()对所有尝试登录的IP进行全局检查。这是一个未经测试的建议,您可能需要做更多的事情来满足您的需求。

更新:验证登录的额外字段

AuthenticatesUsers.php中查看函数attemptLogin(这是针对v5.5)

以下是一个示例,但需要进行测试:

/**
 * Attempt to log the user into the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return bool
 */
protected function attemptLogin(Request $request)
{
    $credentials = array_add($this->credentials($request), 'status', '1');
    return $this->guard()->attempt(
        $credentials, $request->has('remember')
    );
}

将此与doc进行比较,您将找到该模式。它与:

相同
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // The user is active, not suspended, and exists.
}