将 Laravel 多身份验证用户视为唯一的用户类

Posted

技术标签:

【中文标题】将 Laravel 多身份验证用户视为唯一的用户类【英文标题】:Treat Laravel multi auth users as a unique user class 【发布时间】:2019-03-26 06:25:36 【问题描述】:

我已经为这个问题苦苦挣扎了几天,我到处搜索,但找不到合乎逻辑的解决方案。

我的项目中需要多种类型的用户(管理员、客户),因为每种类型都需要完全不同的后端逻辑。所以我决定在 laravel 中使用多重身份验证方法(对于这些情况,AFAIK 是最好的解决方案)。因此,我为每种类型(以及 DB 中的多个表)提供了多个用户类,包括 AdminUser 类。 AdminAuthUserAuth 类管理登录和注册逻辑,并且使用中间件处理路由。

到目前为止,没有任何问题。问题是我需要在另一个类中使用单个用户类。例如考虑消息传递逻辑(并且有许多类似的用例):

一个消息类模型应该有:

protected $fillable = [
    'from_id', 'to_id', 'content', 'state'
];

 public function sender()
     return $this->belongsTo(**User::class**);
 

 public function receiver()
     return $this->belongsTo(**User::class**);
 
 ...

在上述模型中,我需要为发送者和接收者指定User::class,可以是管理员也可以是用户。那么我如何告诉 Eloquent 使用这两种模型。甚至可能吗?如果没有,这里的解决方案是什么?

我曾想过使用名为 Person 的更高级别的类来保存 Admin 或 User 对象实例,但这样 ORM 无法自动从/在适当的表中检索或存储用户。

非常感谢任何建议。

【问题讨论】:

【参考方案1】:

我建议您使用以下指南来处理此类功能;为每个用户类型创建一个模型,但所有这些都应该通过保留用户的 id 与 Laravel 的默认用户类建立关系。此外,在用户类中保留通用属性,在每个子类中保留特定属性,例如客户可以有地址,管理员可以有电话号码,而用户名等常见内容可以保留在用户模型中。然后您将不需要多个表单进行登录,当用户登录时,您会相应地重定向到默认用户记录中的用户类型。现在对于您的消息传递问题,使用默认用户模型在消息中建立关系,如上所示。然后根据用户的类型进行辩护,在聊天中授予他不同的权限或功能。

【讨论】:

以上是关于将 Laravel 多身份验证用户视为唯一的用户类的主要内容,如果未能解决你的问题,请参考以下文章

laravel 跨域身份验证 cookie 和过滤器

如何在 laravel 护照中实现多身份验证

Laravel - 用户未通过身份验证时如何重定向到所需页面

具有唯一字段的 Laravel 验证服务

Angular 和 Laravel 身份验证 JWT?

将 laravel 5 内置身份验证扩展为仅登录“如果用户 == 活动”