在MVC Web应用程序中放置授权的位置?

时间:2016-10-20 15:50:11

标签: model-view-controller web-applications architecture authorization

方案

您正在为营销部门构建Web应用程序。市场营销 部门已经要求建立一个博客平台,以便他们能够留住您的客户 最新的公司新闻。您决定构建传统的MVC 带有关系数据库的Web应用程序。你选择了一个LAMP(Linux Apache PHP MySQL)堆栈或类似。

营销团队的要求非常简单。他们想要:

  • 营销团队的任何成员都可以创建博客文章
  • 任何能够阅读博客文章的人
  • 原作者或经理可以编辑博客文章
  • 原作者或经理可以删除博客文章
  • 任何人都可以列出所有博客帖子

根据这些要求,您决定实施RBAC(基于角色的访问) 控制)。您将角色定义为:

  • 管理器
  • 有一手
  • 访客

您还创建了一个“帖子控制器”,它有五个动作:

  • 创建
  • 更新
  • 删除
  • 列表

最后,您设置了一个身份验证系统。认证系统将 始终返回您实施的角色之一。如果用户已登录 你会得到一个“经理”或“营销人员”(取决于他们的工作 在你的公司内)。如果用户未登录,您将返回“访客”。

开发进展顺利,直到您开始实施授权 “更新”行动。

问题

此网站中的“更新”操作应在何处进行授权 应用

请确保不要混淆身份验证(检查用户是否已登录) 通过授权确定他们是谁(检查用户是否允许) 做他们想做的事。)

可能的答案

  1. 模特。

    • 由于您无法查看原作者,因此无法进入操作 在你打电话给模特之前的博客文章。
    • 你的业务逻辑应该在模型中坚持“瘦身” 控制器,胖模型“经验法则。
    • 授权不应该在行动中发生,因为我们最终会 在调用相同模型的多个操作中复制我们的逻辑 方法。
  2. 行动。

    • 授权不能在模型中发生,因为并非所有操作都使用a 模型。那么“创造”行动怎么样?它可能只呈现HTML表单。 这意味着将跳过授权。
    • 将用户对象传递给每个模型方法似乎很麻烦。不是这样的 该操作因为它知道用户所在的HTTP会话 存储
    • 计划任务或cronjob运行时会发生什么? RBAC在这里没有位置 除非我们实施“系统”角色。如果授权发生在 行动计划任务不需要知道角色。
    • 如果到模型时检查授权为时已晚 方法被称为?被调用的方法可以是三个中的一个 一种行为。如果前两次通过而第三次失败则可以介绍 您的Web应用程序的错误。提前完成所有授权检查 避免这种情况。
  3. 动作和模型。

    • 将授权拆分为“基于角色的身份验证”和 “业务逻辑认证”可能有效。但你会在哪里画出来的 线?
  4. 其他地方。

    • 我在MVC网络应用程序中缺少一个图层吗?服务层或 中间件在这里有帮助吗?

2 个答案:

答案 0 :(得分:0)

根据我的经验,当您考虑授权管理时,您必须经常考虑将 Aspect 理解为 AOP 范例(或类似内容)的元素。因此,它可以保持在所有应用程序层之上,但采用非侵入式方法。

谈论哪里应该放置授权管理我认为它必须放在一个共同的地方,在那里你的“行动终点”将被调用和管理。例如,如果您有rest或soap api,则可以将所有授权管理放入第一个请求处理程序之一,以便在调用每个控制器操作之前拒绝未经授权的用户。

回到具有3层的简单MVC应用程序,您可以定义在每个控制器操作之前调用的AuthManager。 如果您的授权管理涉及一些视图动态修改,则应使用不同且更具侵入性的方法,但这是一个不同的问题。

答案 1 :(得分:0)

经过大量的搜索和研究后,我想我找到了自己问题的答案。

满足我需要实现“基于属性的访问控制”(缩写为ABAC)的要求。它也被称为“基于声明的访问控制”和“基于策略的访问控制”。

ABAC使用四个输入来决定是否允许当前用户执行他们正在尝试执行的操作。四个输入是:

  • 主题 - 这是用户对象。它将包含用户ID及其角色。
  • 操作 - 这将是控制器名称和操作名称。
  • 资源 - 这将是我给出的示例中的博客帖子对象。
  • 环境 - 这可能会在我给出的示例中修复。但您可以使用它来区分Web应用程序,API或计划任务。

检查应该在行动中发生。这是一个快速的PHP伪代码示例:

min

应该明白为什么它需要在行动中发生;没有资源(上例中的帖子)要反对检查!