在达到失败的登录尝试总数之后,如何隐藏登录表单?

时间:2019-08-13 18:00:24

标签: laravel authentication laravel-5 laravel-5.8 throttling

我想隐藏登录表单并显示一条错误消息,但是我不能。

我试图将下面的代码重写到显示表单的控制器上,但是,检查过多登录尝试的方法似乎不起作用,并且永远不会返回true。

```php
public function showLoginForm(Request $request)
{
    if (method_exists($this, 'hasTooManyLoginAttempts') &&
        $this->hasTooManyLoginAttempts($request) ) {
            $seconds = $this->limiter()->availableIn($this->throttleKey($request));
            return view('auth.block', array(
                'seconds' => $seconds
            ));
    }

    return view('auth.login');
}

我使用php artisan make管理身份验证过程:auth登录控制器是Laravel生成的默认登录控制器,唯一的变化是显示表单的操作。

2 个答案:

答案 0 :(得分:2)

函数hasTooManyLoginAttempts()$request中需要username(通常是电子邮件)作为密钥,以了解user是否已达到其最大登录尝试次数。

如果在$ request中,没有username带有值,则该函数无法验证user 登录尝试

因此您无法真正知道谁是get要登录表单的用户,您知道谁是 提交表单之后的人。

恕我直言,唯一的方法可能是在GET请求中添加一个username参数,但是您应该为它提供一些解决方法:Cookie,会话等。

答案 1 :(得分:1)

查看Laravel的代码,它基于hasTooManyLoginAttemptsthrottleKey检查maxAttempts

throttleKey取决于用户的电子邮件和IP地址。因此,以下代码的输出类似于:info@example.com|127.0.0.1,即您的throttleKey

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

现在,Laravel在发送$request->input($this->username())请求时从POST获取用户的电子邮件(用户名),您无法在showLoginForm方法中访问该请求,因为该请求是在GET请求。

无论如何,如果您想阻止登录表单,则需要提出自己独特的throttleKey,然后覆盖该方法。假设您希望throttleKey仅基于IP地址-不建议这样做。操作方法如下:

// In LoginController.php 

protected function throttleKey(Request $request)
{
    return $request->ip();
}