在构建我的应用程序时,我通过运行使用了 Laravel 身份验证脚手架php artisan make:auth
这很棒,节省了我很多时间。
但是,我遇到了用户无法登录的问题,因为他们不记得最初注册时使用的电子邮件大小写。
例如,注册的用户[email protected] /cdn-cgi/l/email-protection
无法登录[email protected] /cdn-cgi/l/email-protection
.
我从我的研究中了解到技术上@ 之前的部分区分大小写凭借规范 https://stackoverflow.com/a/9808332/2611917,并且理论上,上面的两封电子邮件可能属于两个不同的人。但在我的情况下,我并不认为我需要在登录时强制执行此操作。
我正在使用 Postgres 数据库,因此我希望将电子邮件数据库查找替换为Auth::attempt()
with ilike
代替like
如果可能的话。然而,我一生都无法找到它在源代码中的位置,因此不知道如何覆盖它。
Tl;dr 如何覆盖 Laravel 的默认身份验证以不区分大小写的方式进行电子邮件查找?
Solution
我最终通过首先采纳 @btl 建议并在电子邮件属性上实现一个 mutator 方法来解决这个问题。我不想检查并更改现有用户的所有电子邮件,并且感觉如果我确实遇到了我想要恢复区分大小写的问题,我想要一个可以的解决方案很容易被撤消。
应用程序/用户.php
public function getEmailAttribute($value) {
return strtolower($value);
}
应用程序/Http/Controllers/Auth/LoginController.php
protected function credentials()
{
$username = $this->username();
$credentials = request()->only($username, 'password');
if (isset($credentials[$username])) {
$credentials[$username] = strtolower($credentials[$username]);
}
return $credentials;
}
不幸的是我不知道如何将同样的逻辑应用到ForgotPasswordController.php
但现在我会活下去。现在,无论电子邮件大小写如何,登录似乎都可以工作。