7

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

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

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

  • Auth.php(门面)
  • AuthManager.php
  • AuthServiceProvider.php
  • 守卫.php
  • auth.php(配置)
  • User.php(雄辩模型)

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

  • AuthCoach.php(门面)
  • AuthCoachManager.php
  • AuthCoachServiceProvider.php
  • 守卫.php
  • authcoach.php(配置)
  • Coach.php(雄辩模型)

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

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

你能看到任何潜在的问题或知道更好的方法吗?

4

2 回答 2

3

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

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

一个快速的总体思路:

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

你有什么多态问题?

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

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

于 2013-09-07T11:01:04.180 回答
3

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

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

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

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

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

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

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

蚊子完全死了。

到你的:

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

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

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

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

不要害怕,儿子

于 2013-09-09T13:57:22.990 回答