laravel - 拉拉维尔。让用户使用不唯一的电子邮件登录
问题描述
我的用户具有唯一的用户名而不是唯一的电子邮件(因为一个用户可以有多个帐户)。
问题:当前登录逻辑:用户可以使用用户名或电子邮件登录。但是如果电子邮件不是唯一的,默认 laravel auth 从数据库中选择第一条记录与该电子邮件,然后检查密码是否匹配(或类似的东西)
覆盖(以某种方式)默认的laravel登录方法并从与用户名和密码哈希匹配的数据库记录中选择是个好主意。像这样:
$user = User::where('email', $email)->where('password', Hash::make($password))->first();
或者这是愚蠢的解决方案,我应该找到另一个?
解决方案
问题出在这里: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 中或可以从登录和注册方法访问的某个地方。
推荐阅读
- firebase - 如何删除 Source.CACHE 中的特定 Firestore 文档?
- node.js - 如何设置 Twilio 工人统计数据的开始和结束日期?
- android - 如何使子 ImageView 采取父 MaterialCardView 的形状外观?
- collision-detection - 如何在 Phaser 3 中使用物质物理从我的瓦片平台创建平台?
- python - Pyautogui 未导入“没有名为 'pyautogui' 的模块”
- python - 应该是无限循环
- c++ - 在 VSCode 中使用 MSVS 编译器构建 OpenCV 应用程序
- python-3.x - 解压字典字典参数,并在多处理池中使用 **kwargs
- javascript - 当第二个可观察值发生变化时,combineLatest 没有发出?
- spring - 将数据从控制器传递到 ChartJS