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

标签 laravel authentication laravel-5 laravel-5.5

在构建我的应用程序时,我通过运行 php artisan make:auth 使用了 Laravel 身份验证脚手架。这很棒,为我节省了很多时间。
但是,我遇到了用户无法登录的问题,因为他们不记得他们最初注册时使用的电子邮件大小写。
例如,使用 Myemail@domain.com 注册的用户无法登录 myemail@domain.com .
我从我的研究中了解到,从技术上讲,@ 之前的部分由 virtue of the spec 区分大小写| ,并且上面的两封电子邮件理论上可能属于两个不同的人。不过,在我的情况下,我不认为我需要在登录时强制执行此操作的可能性还不够。
我正在使用 Postgres 数据库,所以我希望替换 Auth::attempt() 中的电子邮件数据库查找与 ilike而不是 like如果可能的话。但是,我一生都无法在源代码中找到它的位置,因此不知道如何覆盖它。
Tl; dr我如何覆盖 Laravel 的默认身份验证以不区分大小写的方式进行电子邮件查找?
解决方案
我最终通过首先接受@btl 建议并在 email 属性上实现一个 mutator 方法来解决这个问题。我不想为现有用户检查和更改所有电子邮件,并且觉得如果我确实遇到了我希望恢复区分大小写的问题,我想要一个解决方案,可以很容易被撤消。
app/User.php

public function getEmailAttribute($value) {
    return strtolower($value);
}
app/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但现在我会活着。现在无论电子邮件大小如何,登录似乎都可以工作。

最佳答案

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

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

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

或者,在用户模型上使用访问器:
public function getEmailAttribute($value)
{
    return strtolower($value);
}

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

关于laravel - 如何使用 Laravel 5.5 身份验证使电子邮件登录不区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48451166/

相关文章:

php - Laravel:从 Controller 抛出错误

.net - 如何在 .Net HTTPListener Google Chrome 问题中为基本身份验证方案设置领域

php - Laravel sql 查询第三关系

laravel - 如何在 Laravel 5.4 中减去两个日期

php - Laravel Eloquent 关系获取记录到第三级关系

javascript - 表单结束标签在 Bootstrap 4 模式中无法正常工作

authentication - Grails 通过 Spring Security 插件使用 Google 身份验证

php - 使用 mysqli_init() 时尚不允许属性访问。尝试跳过 php 中的安全身份验证

mysql - SQLSTATE[23000] : Integrity constraint violation in Laravel

php - 拉维尔 : Error [PDOException]: Could not Find Driver in PostgreSQL?