【问题标题】:PHP - Where to put RBAC and Authentification in an MVC application? [duplicate]PHP - 在 MVC 应用程序中放置 RBAC 和身份验证的位置? [复制]
【发布时间】:2017-01-01 23:46:44
【问题描述】:

我正在开发具有这种结构的 MVC 应用程序:

   Request
      V
FrontController <-> Router
      V
  Controller <-> Model
      V
     View

我需要在这个结构中放置另外两个组件:

  • Authentification:使用$_SESSION 全局变量登录用户;
  • RBAC基于角色的访问控制,可以检查角色是否有权访问“资源”Controller 方法)。

每个用户都可以拥有任意数量的角色(他们也可以没有)。

现在,我需要将这两个组件放在我的应用程序中,我需要它们能够:

  • 如果User 未经过身份验证,并且Request 需要执行经过身份验证的User,则应将客户端重定向到登录页面;
  • 如果RBAC 发现经过身份验证的User 没有有权访问所需的“资源” 以执行Controller 的方法的角色,则@ 987654332@ 的方法仍应执行,但知道User 没有这样做的权限(示例User 写了一篇文章但无权发表,所以文章保存为草稿,User 被告知Moderator 必须发表)。

我已经有一些想法可以找到AuthentificationRBAC,但我不确定:

  • Authentification 可以加入FrontControllerRouter
  • RBAC 可以进入 FrontControllerController

我看到有人将RBAC 放入模型中,但我不明白为什么。

我想对这个主题有一些见解。我应该将AuthentificationRBAC 组件放在哪里?

谢谢!

【问题讨论】:

    标签: php authentication model-view-controller acl rbac


    【解决方案1】:

    在典型的 MVC 应用程序中,身份验证检查(即“如果不是 auth,则停止并改为呈现登录页面”)在处理请求的早期完成,而业务逻辑(即“如果用户具有此权限,则发生这种情况,否则发生这种情况”)在“C”(控制器)中处理。

    大多数框架都有一种测试机制,例如您所描述的身份验证检查 - 名称各不相同,但我经常看到它被称为“中间件”。

    基于角色的访问控制纯粹是您的实现。

    【讨论】:

    【解决方案2】:

    根据我的经验,门禁控制业务逻辑会随着新功能的添加而变化,因此在门禁控制系统中设计灵活性和移动性是值得的。因此,我会将身份验证和 RBAC 设计为单独的特征,然后根据需要将这些特征合并到控制器空间中。

    如前所述,听起来身份验证特征最好被合并到您的前端控制器中:您知道 所有 依赖控制器 需要 身份验证,因此请尽早合并该检查释放请求套接字的生命周期。如果您的需求发生变化,需要取消控制某些控制器,您可以将 trait 下推到特定的控制器或基控制器类中。

    对于 RBAC,它可以全局应用于所有控制器,也可以局部应用于某些控制器。例如,您的 FrontController 可能会查询 RBAC 来构​​建路由表,而依赖的控制器会使用 RBAC 来满足其特定需求。

    但需要考虑的一点是:模型中可能还有一些 RBAC 需求。也就是说,某些角色可能对某些模型中的某些字段的访问权限有限:角色 A 可以访问模型 X 的所有字段,但角色 B 只能读取模型 X 的字段 1、2 和 3。(相信我,我见过非常,关于角色的非常复杂的规则,可以查看和操作哪些字段。)

    将 RBAC 工程化为控制器特性可能会使移植到模型空间变得困难。因此,您可能会发现将 RBAC 设计为服务委托并按需注入它会更好。使用配置良好的 IoC 容器,服务委托就像编译时特征一样简单。

    最后,我要补充一点,你会希望这两个都经过严格的测试(毕竟它们很重要)。因此,无论您选择什么,工程师都可以对其进行测试。在我看来,traits 和 delegates 都很容易单独测试,并且两者都是实现必要逻辑的好选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多