如何使用Laravel 5.5身份验证使电子邮件登录不区分大小写

bri*_*nna 3 authentication laravel laravel-5 laravel-5.5

在构建我的应用程序时,我通过运行使用了Laravel身份验证脚手架,php artisan make:auth这非常棒并且节省了我很多时间.

但是,我遇到的问题是用户无法登录,因为他们无法记住他们最初注册时用于电子邮件的情况.

例如,注册的用户Myemail@domain.com无法登录myemail@domain.com.

我从我的研究中了解到,在技术上,@之前的部分因规范而区分大小写,并且上面的两封电子邮件在理论上可能属于两个不同的人.在我的情况下,我不认为我有可能需要在登录时强制执行此操作.

我使用的是Postgres数据库,所以我希望只需更换电子邮件数据库中查找Auth::attempt()ilike替代的like,如果可能的.但是,我不能为我的生活找到它在源头的位置,因此不知道我将如何覆盖它.

Tl; dr如何覆盖Laravel的默认身份验证以不区分大小写的方式进行电子邮件查找?

我最终通过首先采用@btl建议并在email属性上实现mutator方法来解决问题.我不想要为现有用户更改所有电子邮件,感觉好像我遇到了一个问题,我想恢复区分大小写,我想要一个可以解决的问题很容易被撤消.

应用程序/ user.php的

public function getEmailAttribute($value) {
    return strtolower($value);
}
Run Code Online (Sandbox Code Playgroud)

应用程序/ HTTP /控制器/认证/ LoginController.php

protected function credentials()
{
    $username = $this->username();
    $credentials = request()->only($username, 'password');
    if (isset($credentials[$username])) {
        $credentials[$username] = strtolower($credentials[$username]);
    }
    return $credentials;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法弄清楚如何应用这个相同的逻辑,ForgotPasswordController.php但现在我会活着.无论现在如何,登录似乎都有效.

小智 7

在您的用户模型上添加mutator方法,使电子邮件全部小写:

public function setEmailAttribute($value)
{
    $this->attributes['email'] = strtolower($value);
}
Run Code Online (Sandbox Code Playgroud)

每当用户注册时,电子邮件将始终转换为小写.

或者,在用户模型上使用访问者:

public function getEmailAttribute($value)
{
    return strtolower($value);
}
Run Code Online (Sandbox Code Playgroud)

这样原始值保存在数据库中,但每当你调用$ user-> email时它都是小写的.在进行严格比较时,您只需要在登录时将用户的输入转换为小写.

  • 但是,如果用户现在尝试使用大写电子邮件地址登录,会发生什么情况?我的猜测是他收到了“无效的凭据”,这对用户来说非常令人困惑。 (2认同)