我有 2 个基础:一个来自 Laravel,另一个来自 XenForo 2(实际上,第二个无关紧要,但为了特异性,让它如此吧)。在 Laravel 上,不应该进行注册,而只能在论坛上进行,以减少数据重复并消除由于某种原因发生的不同步。
XF 有 2 个表:xf_users - 存储有关用户的基本信息,以及xf_user_authenticate - 存储带有密码哈希的序列化数组字符串。
需要通过这两个表进行认证。用户正确输入了登录名/密码 - 输入了 Laravel。 这如何在 Laravel 中实现?
连接第三方数据库很容易:在User模型中手动注册连接如下:
protected $connection = 'forum';
protected $table = 'xf_users';
public $timestamps = false;
我还创建了一个密码模型来从 xf_user_authenticate 表中获取密码,并使用一种方法来获取密码哈希:
class Password extends Model
{
protected $fillable = ['data'];
protected $connection = 'forum';
protected $table = 'xf_user_authenticate';
public $timestamps = false;
public static function getPassHash($uid){
$data = Password::firstWhere('user_id', '=', $uid)->get();
return unserialize($data->data)['hash'];
}
}
此外,据我了解,您需要制作自定义警卫和提供者,在这里我不再了解下一步该做什么......
UPD:下面的答案基本上是正确的,它们确实有助于非常复杂的“意大利面”身份验证,但是我在阅读文档后仍然缺乏对所写内容的理解。
然而,当我试图解决这个问题时,一个平庸而简单的解决方案出现了——覆盖模型给出的密码。然后问题立即解决。最初,我认为方向是正确的,但我对框架本身没有足够的了解。User 模型应如下所示(特别是从 XF 获取数据和验证用户):
class User extends Authenticatable
{
use Notifiable;
protected $fillable = ['username', 'email', 'password', 'user_state']; //Не обязательно, если не нужно записывать пользователей, а только брать
protected $connection = 'forum';
protected $table = 'xf_user';
protected $primaryKey = 'user_id';
public $timestamps = false;
public function getAuthPassword(){
$password = Password::where('user_id', '=', $this->user_id)->select('data')->first();
return unserialize($password->data)['hash'];
}
}

