首页 > 解决方案 > 拉拉维尔。让用户使用不唯一的电子邮件登录

问题描述

我的用户具有唯一的用户名而不是唯一的电子邮件(因为一个用户可以有多个帐户)。

问题:当前登录逻辑:用户可以使用用户名或电子邮件登录。但是如果电子邮件不是唯一的,默认 laravel auth 从数据库中选择第一条记录与该电子邮件,然后检查密码是否匹配(或类似的东西)

覆盖(以某种方式)默认的laravel登录方法并从与用户名和密码哈希匹配的数据库记录中选择是个好主意。像这样:

$user = User::where('email', $email)->where('password', Hash::make($password))->first();

或者这是愚蠢的解决方案,我应该找到另一个?

标签: laravelauthenticationlaravel-5

解决方案


问题出在这里:where('password', Hash::make($password))。每次使用相同的密码时,哈希值都会不同。它不是 MD5,因此,您无法将其与数据库中的字符串进行比较。

因此,您需要遍历并进行哈希检查以找到正确的(如果有)像这样的...

$users = User::where('email', $email)->get();
$authenticateable = false;

foreach($users as $user) {
    if(Hash::check($password, $user->password)) {
        $authenticateable = $user;
        break;
    }
}

if($authenitcateable) {
    // Login
} else {
    // Handle bad login attempt
}

请参阅有关散列的Laravel 文档

编辑

正如@ceejayoz 在评论中准确指出的那样,这确实让 OP 可以为同一封电子邮件重复密码。解决方案很简单。在注册期间,您需要对用户执行完全相同的循环,如果发现用户具有相同的电子邮件和匹配的密码,则返回拒绝该帐户的响应。因此,这个循环应该放在一个 trait 中或可以从登录和注册方法访问的某个地方。


推荐阅读