我正在构建一个Laravel 4应用程序,该应用程序需要3种实体类型的登录验证:Coach,Student&管理员,都有独立的用户界面。虽然我可以使用像Sentry 2这样的软件包和一个带有用户类型的单个数据库用户表来实现这一点,但是关于可能出现在轨道上的潜在多态数据库设计模式和令人头疼的事情,并不适合我。处理过去以前的应用程序的多态问题,以及当你想要规范化数据库结构时可以创建的悲痛等等,为每个实体类型分别设置数据库表似乎是一种更好的方法。
您如何解决这个设计问题?
Laravel 4 auth基本上使用以下文件:
我已经玩过复制这些文件,主要是为工作的教练实体提供一个独立的auth,在app.php文件中注册facade和服务提供者,以及对config进行必要的更改使用Coach eloquent模型进行身份验证:
我仍在使用标准Laravel 4 auth中的Guard.php,但是如果需要通过创建GuardCoach.php文件来定制Guard方法的Guard方法,可以轻松扩展Guard。
如果我要为每种实体类型分别使用auth,您认为这是实现它的好方法吗?
你能看到任何潜在的问题或知道更好的方法吗?
答案 0 :(得分:3)
也许我不太了解您的上下文,但为什么不使用基于角色的访问控制的基本概念并为不同的角色呈现不同的东西?如果这不够紧,您可以使用基于属性的身份验证策略来细化权限。您想要复制(三倍)auth-logic的原因是什么?没有提到冗余数据库数据的事实(单独的用户表用于单独的用户类型?yuk!)?
如果您对Sentry不满意(个人而言,我不使用该库)我可以推荐Zizaco / Confide + Zizaco / Entrust作为用户/角色/权限管理的干净而优雅的解决方案。请在此处查看Zizaco GitHub。
快速的一般想法:
您的多态问题是什么?
如果您担心您的用户表会变得混乱,请将其留作存储身份验证详细信息的位置,并将所有其他必要(非身份验证)用户详细信息放在另一个表中。
希望这可以帮助你,只要我理解你的问题。
答案 1 :(得分:3)
我想你是想用木槌敲打蚊子。
以下是我解决同一问题的方法:
我想确保每个用户的身份验证(用户名,密码)都存储在同一个表中。基本上,我有三种类型的用户。
我使用了Sentry 2,它可以轻松管理身份验证。
使用Sentry 2提供的默认迁移,我在“用户”表中添加了一个“角色”列,用于区分3种类型的用户。
对于每种用户类型,我创建了一个包含特定字段的表。
当用户通过身份验证后,我会从“用户”表中获取“角色”,运行一些if语句并知道为其提供的视图。
蚊子已经死了。
到你的身上:
基本上,我们的方法都是相同的 - 因为每个用户类型 有一个单独的表,他们不共享的字段(名字除外, 姓氏,电子邮件,密码,上次登录等。)
您的方法将允许用户属于三个实体 - 这在逻辑上是不正确的。我不会 - 这在逻辑上是......
你害怕'多态问题',但我认为我们在这里没有太多需要处理的问题。我们可能做的就是在我们的模型中定义一个教练,例如belongsTo
用户。还有一位用户hasOne
教练。
但实际上,我们甚至不需要定义关系。因为在身份验证时,我们无论如何都需要运行if语句。因此,使用从身份验证返回的用户对象,我们将知道两件事:然后转到哪个表以获取用户类型特定信息以及向经过身份验证的用户提供哪个视图。
别害怕,儿子