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;
花了一段时间,但我想出了如何使用自定义用户 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;