uuid - Laravel 8 Fortify 用户 UUID 登录问题
问题描述
我目前正在使用 Laravel 8 设置一个新项目。开箱即用,Laravel 配置为使用自动递增 ID 作为用户 ID。在过去,我通过执行以下操作来覆盖这一点。
将用户表创建迁移中的 ID 列更新为
$table->uuid('id');
$table->primary('id');
添加以下特征
trait UsesUUID
{
protected static function bootUsesUUID()
{
static::creating(function ($model) {
$model->{$model->getKeyName()} = (string) Str::orderedUuid();
});
}
}
将以下内容添加到用户模型文件
use UsesUUID;
public $incrementing = false;
protected $primaryKey = 'id';
protected $keyType = 'uuid';
在这个新项目上,我做了和上面一样的事情。这似乎破坏了登录功能。输入并提交电子邮件和密码后,表单会清除,就像页面已刷新一样。需要注意的是,如果电子邮件和/或密码错误,则不会像预期的那样返回典型的验证错误消息。
为了检查是否确实找到了正确的帐户并正确检查了密码,我将以下代码添加到 FortifyServiceProvider 引导方法中。日志文件确认找到了用户并且用户对象转储也是正确的。
Fortify::authenticateUsing(function(Request $request) {
\Log::debug('running login flow...');
$user = User::where('email', $request->email)->first();
if ($user && Hash::check($request->password, $user->password)) {
\Log::debug('user found');
\Log::debug($user);
return $user;
}
\Log::debug('user not found');
return false;
});
撤消对用户模型的上述更改可修复登录问题。但是,它引入了一个新问题,即登录会成功,但登录的不是正确的帐户。例如,有3个帐户,我输入第二个或第三个帐户的凭据,但无论如何,系统将始终使用第一个帐户登录。
任何人对我可能做错了什么有任何建议或想法,或者是否有人遇到过相同/类似的问题以及您如何解决它?
谢谢。
解决方案
在挖掘了更多之后,我找到了解决方案。
Laravel 8 现在将会话存储在数据库的会话表中。session 表有一个user_id列,它是users 表中id 列的外键。
查看会话表的迁移文件,我发现我忘记更改以下问题。
从
$table->foreignId('user_id')->nullable()->index();
至
$table->foreignUuid('user_id')->nullable()->index();
这是因为 Laravel 8 默认使用自动递增 ID 作为用户 ID。由于我已将用户表的 ID 列修改为 UUID,因此我也忘记更新会话表中的引用。
推荐阅读
- python - Processing.py - 类定义上的未知错误
- swift - 如何仅裁剪视图的左侧和右侧?
- asterisk - 星号广播
- java - java-使用提交事务插入表
- python - 在 Amazon Linux 中,无法在 virtualenv 中安装 pandas 和 numpy
- linux - 如何在 Linux 中正确使用带有 Bluez 的 HCI 设备
- mongodb - mongodb 集合未加载到配置单元表中
- python-3.x - 在 LightGBM 中使用多个自定义指标
- amazon-web-services - 如何指定 ECS 服务名称
- node.js - Browsersync 不重新加载浏览器或注入 css