Model view controller 授权应该是模型或控制器的一部分吗?

Model view controller 授权应该是模型或控制器的一部分吗?,model-view-controller,authorization,playframework,Model View Controller,Authorization,Playframework,我正在编写一个具有一些ACL要求的web应用程序:用户可以对某些项目进行更改,某些项目可以由多个用户编辑,管理员可以编辑任何内容,经理可以编辑其组织内的所有内容,等等 我在用这个剧本!框架,并且从安全模块的外观来看,似乎将授权问题放在控制器中。然而,在我看来,授权问题是业务逻辑的一部分,因此应该在模型中。此外,我开始在需要重构的控制器中看到重复的逻辑 另一方面,向模型中添加授权意味着我必须有某种方法从模型中获取当前用户,这似乎是不对的。或者,我可以为每个模型方法添加一个“current_user

我正在编写一个具有一些ACL要求的web应用程序:用户可以对某些项目进行更改,某些项目可以由多个用户编辑,管理员可以编辑任何内容,经理可以编辑其组织内的所有内容,等等

我在用这个剧本!框架,并且从
安全
模块的外观来看,似乎将授权问题放在控制器中。然而,在我看来,授权问题是业务逻辑的一部分,因此应该在模型中。此外,我开始在需要重构的控制器中看到重复的逻辑

另一方面,向模型中添加授权意味着我必须有某种方法从模型中获取当前用户,这似乎是不对的。或者,我可以为每个模型方法添加一个“current_user”参数,但这似乎更糟


那么通常的做法是什么呢?我可以/应该将授权码放入模型中,还是将其保存在控制器中?

我认为这是一个灰色区域。有人可能会说,用户访问是HTTP世界和面向对象世界之间映射的一部分。这就是控制器的用途(因此大量使用静态),用于转换传入请求,准备处理域模型上的业务规则


我认为控制器逻辑绝对是控制对模型访问的正确位置,特别是因为它主要在注释级别进行管理,并且身份验证被抽象为一个安全类。

在大多数情况下,安全性应该是模型之上的一个(或多个)层。安全性本身就是一个域,限制对较低级别层的访问

我不认为安全应该在控制器级别进行

在我看来,这应该是这样的:

查看->控制器->安全->模型

安全层可以是模型的外观或代理,保护访问,但对控制器是透明的


但是,如果要根据用户的访问权限修改视图,则可能必须在控制器级别进行一些检查(例如在ViewModel上设置CanEdit布尔属性的值)

我个人非常喜欢这出戏的风格!安全模块处理此问题()。如果您不介意使用
@Before
注释,那么它非常简单。

授权不应该是控制器或域模型的一部分

相反,它应该在服务层中

控制器应该只是充当HTTP和应用程序服务之间的调度器和委托。 它是进行编排的应用程序服务。这是放置授权的最佳位置

假设用户A被授权访问域X中的数据,但甚至未被授权读取域Y中的数据。如果在控制器中设置了授权,则用户A在控制器X中获得授权,并且通过服务调用可以访问域Y中的数据,这不是我们所期望的


由于域模型在服务层上相互通信,因此最好将授权放在同一级别上。

我处于此阶段,打算通过以下方式处理此问题:

  • JS没有表单验证,而是通过HTTPS ajax

  • ajaxphp类

  • 发送到模型的表单数据作为其数据,用于对
    常见类型,如电子邮件和密码(可能assoc数组验证将被其他类重用,因此这肯定是一个模型区域)

  • 如果没有错误,请在用户表中查找凭据电子邮件/
    通过身份验证传递给控制器的密码凭据
    类型,如登录/注册/密码重置

  • 然后,控制器生成所需的输出视图或设置用户登录会话等

这是基于Laravel的,但我有自己的库,因为我希望它独立于Laravel,只是松散地基于这一重要需求


关键是模型将所需的凭证作为数据查找,然后发送给控制器,因为它不关心应该如何处理它。我认为这是使该领域成为每个组件之间的明确责任的唯一方法。

根据我个人使用MVC框架的经验,我想说:

  • 模型是一个对象,它表示它应该是的数据库表 纯,不应包含任何附加逻辑
  • 控制者是做出决策和其他决策的地方 自定义逻辑,因此授权应该在控制器中。信息技术 可以设计一些钩子,可以检查用户是否被授权 或者不在所有需要的地方,这样您就不会有代码重复

  • 如果您使用的是典型的 REST体系结构是制作一个令牌,将其保存在数据库中,然后继续 客户端,并在每个请求上验证此令牌。如果您正在使用 web浏览器应用程序您可以使用服务器端会话进行授权( 这要容易得多)


  • 因此,我的建议是将授权逻辑保留在控制器中。

    在我看来,我认为这是绝对正确的,但是,这是一个灰色区域,因此可以进行解释。因此,这取决于您是否同意我的解释:o)您将安全性和授权混为一谈。必须在应用程序的每一层处理安全问题-请参阅:纵深防御。问题是“授权属于哪里?”,而不是安全性。因此,如果存在一种逻辑,即超级管理员可以访问所有资源,而管理员可以访问某些资源,那么这种逻辑位于哪里:控制器(授权)、服务或域模型等等,如果有一个逻辑,超级管理员可以访问所有资源,而管理员可以访问一些资源,