Laravel 4 多用户身份验证

Posted

技术标签:

【中文标题】Laravel 4 多用户身份验证【英文标题】:Laravel 4 Multi User Authentication 【发布时间】:2013-09-11 09:50:15 【问题描述】:

我正在构建一个 Laravel 4 应用程序,它需要对 3 种实体类型进行登录身份验证:教练、学生和管理员,它们都具有单独的用户界面。虽然我可以使用像 Sentry 2 这样的包和带有用户类型的单个 DB 用户表来实现这一点,但关于潜在的多态 DB 设计模式和可能出现的头痛问题,我并不满意。过去处理过以前的应用程序的多态性问题,以及当您想要规范化数据库结构等时可能产生的痛苦。为每种实体类型设置单独的数据库表似乎是一种更好的方法。

你会如何解决这个设计问题?

Laravel 4 auth 基本上使用以下文件:

Auth.php(外观) AuthManager.php AuthServiceProvider.php Guard.php auth.php(配置) User.php(雄辩模型)

我已经尝试复制这些文件,以便为有效的 Coach 实体提供一个独立的身份验证,在 app.php 文件中注册外观和服务提供者,以及对配置进行必要的更改以使用 Coach eloquent 模型进行身份验证:

AuthCoach.php(外观) AuthCoachManager.php AuthCoachServiceProvider.php Guard.php authcoach.php(配置) Coach.php(雄辩模型)

我仍在使用来自标准 Laravel 4 身份验证的 Guard.php,但如果需要通过创建 GuardCoach.php 文件来自定义教练身份验证的 Guard 方法,可以轻松扩展 Guard。

如果我要对每种实体类型进行单独的身份验证,您认为这是实现它的好方法吗?

您能发现任何潜在问题或知道更好的方法吗?

【问题讨论】:

我在这里回答了一个类似的问题:***.com/questions/18785754/…不确定它是否会有所帮助...... 你解决过这个问题吗? 【参考方案1】:

我想你是想用木槌打蚊子。

这是我解决相同问题的方法:

我想确保每个用户的身份验证(用户名、密码)都存储在同一个表中。基本上,我有三种类型的用户。

我使用了 Sentry 2,这使得管理身份验证内容变得轻而易举。

使用 Sentry 2 提供的默认迁移,我在“用户”表中添加了一个“角色”列 - 它区分了 3 种用户类型。

对于每种用户类型,我创建了一个包含特定字段的表。

当用户通过身份验证时,我会从“用户”表中获取他们的“角色”,运行一些 if 语句并知道为他们服务的视图。

而蚊子完全死了。

到你的:

基本上,我们的两种方法都是相同的 - 因为每个用户类型 为他们不共享的字段有一个单独的表(名字除外, 姓氏、电子邮件、密码、上次登录等)。

您的方法将允许用户属于这三个实体 - 这在逻辑上是不正确的。我的不会 - 这是合乎逻辑的......

您害怕“多态问题”,但我认为我们在这里没有太多需要处理的事情。我们可能要做的就是在我们的模型中定义一个教练,例如,belongsTo 一个用户。还有一个用户hasOne教练。

但实际上,我们甚至不需要定义关系。因为在身份验证时,无论如何我们都需要运行 if 语句。因此,使用从身份验证返回的用户对象,我们将知道两件事:然后转到哪个表以获取用户类型特定的信息,以及为经过身份验证的用户提供哪个视图。

别害怕,儿子

【讨论】:

然后您将使用什么 ID 作为数据库其余部分中每个用户类型的 FK(外键)? auth 表 ID,还是用户特定的表 ID? 我会使用用户 ID,因为我知道它对每个用户都是唯一的。如果您使用用户类型 ID,它不会是唯一的,因为每个用户类型都有一个单独的表(教练、学生、管理员)。您不必担心三个表具有外键,因为它们只是补充用户表。 users 表是“老板”。 好酷。所以给定这个模式,如果你有一个课程表,考虑到两种用户类型都有一个 FK user_id,你将如何记录课程涉及的教练和学生?单个关系 ID 也可以在这里工作,方法是拥有一个 user_parent_child 表 (id, parent_id (coach user_id), child_id (student user_id)) 并将 user_parent_child_id 作为 FK 记录在课程表中。不过这看起来真的很乱。 在这种情况下 - 因为一堂课是针对教练和学生的,你显然需要在课程表中包含 id|coach_id|student_id 等字段。然后,如果您正确定义了您的用户/教练和用户/学生关系,要获取包含给定课程中学生信息的课程对象,您只需要执行类似 $lesson = Lesson::with('student .user')->get();例如。 我将使用 innoDB 表设置 FK 以保持良好的数据库完整性,课程表中的 coach_id 和 student_id 都将具有 user_id 的 FK,这意味着不会对 user_id 类型进行数据库验证在课表中。教练用户类型可以记录在 student_id 中,反之亦然。其他 DBMS 允许 FK 约束来管理这个,但据我了解,这在 mysql 中非常具有挑战性。随着数据库的增长,这些完整性问题将随处可见,这又回到了我最初对拥有一个具有用户类型分类的用户表的担忧。想法?【参考方案2】:

也许我不太了解您的上下文,但是您为什么不使用基于角色的访问控制的基本概念并为不同的角色呈现不同的东西呢?如果这还不够严格,您可以使用基于属性的身份验证策略来细化权限。您想要复制(三重)auth-logic 的原因是什么?没有提到冗余数据库数据的事实(单独的用户表用于单独的用户类型?yuk!)?

如果您对 Sentry 不满意(就我个人而言,我不使用那个库),我可以推荐 Zizaco/Confide + Zizaco/Entrust 作为用户/角色/权限管理的简洁优雅的解决方案。在这里查看Zizaco GitHub。

一个快速的总体思路:

对整个应用使用单一的干净身份验证机制 使用角色或角色+权限细化访问 将您的管理逻辑分离到单独的控制器中(AdminUserController、AdminCoachController 等等) 我认为在组合适当的刀片模板结构以使其做得很好且组织良好时没有困难

您的多态问题是什么?

如果您担心您的用户表会变得混乱,请将其保留为存储身份验证详细信息的地方,并将所有其他必要(非身份验证)用户详细信息放在另一个表中。

希望这对您有所帮助,如果我能很好地理解您的问题。

【讨论】:

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

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

laravel 4.2 如何检查是不是有用户登录多重身份验证

Laravel 4 身份验证注销错误

Laravel 4:基于身份验证状态的单个 URI 的两个不同视图页面

Laravel 4:股票身份验证登录不会跨页面持续存在

Laravel 4 - 硬编码身份验证