我想隐藏登录表单并显示一条错误消息,但是我不能。
我试图将下面的代码重写到显示表单的控制器上,但是,检查过多登录尝试的方法似乎不起作用,并且永远不会返回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生成的默认登录控制器,唯一的变化是显示表单的操作。
答案 0 :(得分:2)
函数hasTooManyLoginAttempts()
在$request
中需要username
(通常是电子邮件)作为密钥,以了解user
是否已达到其最大登录尝试次数。
如果在$ request中,没有username
带有值,则该函数无法验证user
登录尝试。
因此您无法真正知道谁是get
要登录表单的用户,您知道谁是 提交表单之后的人。
恕我直言,唯一的方法可能是在GET请求中添加一个username
参数,但是您应该为它提供一些解决方法:Cookie,会话等。
答案 1 :(得分:1)
查看Laravel的代码,它基于hasTooManyLoginAttempts
和throttleKey
检查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();
}