花了一段时间,但我想出了如何使用自定义用户表以及自定义用户名和密码字段在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() - > 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';
}
答案 0 :(得分:1)
我找到了答案。诀窍是让Laravel知道主键字段是字符串类型,方法是通过将主键的自动增量添加到用户模型来解除主键的自动增量:
protected $table = 'Contact';
protected $primaryKey = 'ContactId';
public $incrementing = false;
答案 1 :(得分:0)
尝试在用户模型中覆盖此方法
/**
* Get the unique identifier for the user.
*
* @return mixed
*/
public function getAuthIdentifier()
{
return $this->ContactId;
}
注意:此方法是" Authenticable"性状。
请告诉我这是否适合您。