提问者:小点点

Laravel 5.3通过uniqueidentifier返回Auth:user()


这花了一段时间,但我想出了如何使用自定义用户表成功验证Laravel 5.3中的用户,该表具有自定义用户名和密码字段。

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

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

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

LoginController Http\Controllers\Auth\LoginController。php:

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

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

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

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

我现在面临的唯一问题是,这个自定义表使用MSSQL uniqueidentifier作为主键。现在,当我调用Auth::user()时-

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

由于某种原因,该用户的实际ContamtID(它是字符串07164BAE-33AE-E511-AE88-000C29C93884)被转换为int,导致7164。

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

蒂娅,沃特

编辑

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

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

共2个答案

匿名用户

我找到了答案。诀窍是通过将主键的自动增量添加到用户模型中,消除主键的自动增量,让Laravel知道主键字段的类型为string:

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

匿名用户

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

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

注:此方法是“可验证”特征的一部分。

让我知道这是否适合你。