Laravel 5.3 return Auth:user() 由 uniqueidentifier

Laravel 5.3 return Auth:user() by uniqueidentifier

花了一段时间,但我想出了如何使用自定义用户 table 以及自定义用户名和密码字段在 Laravel 5.3 中成功验证用户。

我需要更改我的用户模型:

protected $table        = 'Contact';    
protected $primaryKey   = 'ContactId';

public function getAuthPassword()
{
    return $this->New_hashedpassword;
}

登录控制器Http\Controllers\Auth\LoginController.php:

public function username()
{
    return 'EMailAddress1';
}

为了测试,我还更改了 LoginController 中的重定向:

protected function redirectTo()
{
    dd(Auth::user());
}

成功登录后,将正确的用户模型传递给浏览器。

我现在面临的唯一问题是这个自定义 table 使用 MSSQL uniqueidentifier 作为主键。所以现在当我调用 Auth::user()->someUserAttribute 时,我的 Laravel 应用会抛出一个错误:

[SQL Server]Operand type clash: uniqueidentifier is incompatible with int (SQL: select top 1 * from [Contact] where [Contact].[ContactId] = 7164)

出于某种原因,此用户的实际 ContactID(字符串“07164BAE-33AE-E511-AE88-000C29C93884”)被转换为 int,结果为“7164”。

我不明白为什么 LoginController 可以毫无问题地访问 Auth::user(),但在应用程序的其他任何地方访问 Auth::user() 都会引发错误。

TIA, 沃特

编辑

当我按照 Jeff 的建议编辑我的用户模型时,通过添加 getAuthIdentifier 并对我的测试用户的 UUID 进行硬编码,可以成功访问 Auth::user() 对象。但是我如何告诉 Laravel 将 ContactId 转换为字符串而不是整数?

public function getAuthIdentifier()
{
    //return $this->ContactId;      
    return '07164BAE-33AE-E511-AE88-000C29C93884';
}

尝试在您的用户模型中覆盖此方法

/**
 * Get the unique identifier for the user.
 *
 * @return mixed
 */
public function getAuthIdentifier()
{
    return $this->ContactId;
}

注意:此方法是 "Authenticable" 特征的一部分。

让我知道这是否适合你。

我找到了答案。诀窍是让 Laravel 知道主键字段是字符串类型,方法是通过将此添加到用户模型来禁用主键的自动递增:

protected $table        = 'Contact';    
protected $primaryKey   = 'ContactId';
public $incrementing    = false;