首页 > 解决方案 > 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个帐户,我输入第二个或第三个帐户的凭据,但无论如何,系统将始终使用第一个帐户登录。

任何人对我可能做错了什么有任何建议或想法,或者是否有人遇到过相同/类似的问题以及您如何解决它?

谢谢。

标签: uuidlaravel-8laravel-authentication

解决方案


在挖掘了更多之后,我找到了解决方案。

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,因此我也忘记更新会话表中的引用。


推荐阅读