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

时间:2018-01-25 20:14:00

标签: laravel authentication laravel-5 laravel-5.5

在构建我的应用程序时,我通过运行Myemail@domain.com来使用Laravel身份验证脚手架,这非常棒并且节省了我很多时间。

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

例如,使用myemail@domain.com注册的用户无法使用Auth::attempt()登录。

我从我的研究中了解到技术上 @之前的部分是virtue of the spec的区分大小写,并且上面的两封电子邮件理论上可以属于两个不同的人。在我的情况下,我不能预见到我需要在登录时强制执行此操作。

我正在使用Postgres数据库,因此我希望尽可能用ilike而不是like替换public function getEmailAttribute($value) { return strtolower($value); } 中的电子邮件数据库查找。但是,我不能为我的生活找到它在源头的位置,因此不知道我将如何覆盖它。

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

解决方案

我最终通过首先获取@btl建议并在email属性上实现mutator方法来解决问题。我不想要为现有用户更改所有电子邮件,感觉好像万一我遇到了一个问题,我想要回复感情况,我想要一个可以轻易解开的解决方案。

应用/ user.php的

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

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

ForgotPasswordController.php

不幸的是,我无法弄清楚如何将同样的逻辑应用到numpy.abs(A) ,但现在我还活着。无论现在的电子邮件情况如何,登录似乎都有效。

4 个答案:

答案 0 :(得分:5)

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

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

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

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

public function getEmailAttribute($value)
{
    return strtolower($value);
}

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

答案 1 :(得分:2)

您也可以像这样进行自定义尝试。

 $credentials = ['email' => 'useremail@gmail.com', 'psasword' => 1234];

 public function checkAttempt($credentials)
 {
     $user = UserTable::whereRaw('lower(email) = ? ', [$credentials['email']])->firstorFail();

     $validPassword = Hash::check($credentials['password'], $user->password;

     if ($user  && $validPassword)
     {
        // set user session over here
     }
 }

答案 2 :(得分:0)

@btl答案是完美的,但还有另一种方式。

Yout可以编辑寄存器控制器。

应用/ HTTP /控制器/认证/ RegisterController.php

protected function create(array $data)
{
   return User::create([
       'name' => $data['name'],
       'email' => strtolower($data['email']),
       'password' => bcrypt($data['password']),
   ]);
}

答案 3 :(得分:0)

我想保留大小写(在我的情况下为用户名)在数据库中的指定方式。我能找到的唯一方法是重写UserProvider(特别是restoreByCredentials部分)。这似乎是一个简单的更改,这确实很麻烦。最后,我没有使用Auth :: attempt方法,而是通过手动检索用户,检查密码,然后使用Auth :: login方法来解决此问题:

$user = User::where('username', 'ilike', $req->input('username'))->first();

if (!$user ||
    !Hash::check($req->input('password'), $user->password)
) {
    return response()->json(['status' => 'FAILED']);
}
Auth::login($user);