通常,我将授权决策放在服务器端控制器中。最近这些都是RESTful端点,但我认为这也代表了MVC类型的架构。为了争论,假设它是基于角色的授权。受保护的方法将进行注释或进行检查,并在必要时返回403 s。
现在,考虑到授权实际上是一条业务规则--例如“只有管理员才能列出X”,我认为他们应该向下推一层。当控制器要求业务层执行操作时,服务或业务层通知控制器它没有得到授权。
这是否一个合理的方法?这样做有坏处吗?
我不喜欢有一个AuthorisationService,它本质上保存了一堆静态的过程编码规则来完成这个任务,但是也许把所有的访问逻辑保持在一个地方是有意义的。这是一个横切的关注,应该保持分开?
所以我要问的是,是否有人做到了这一点,以及他们是如何以一种干净的方式实现的,或者我是否可以阅读到任何好的资源。我正在使用Java,但这是一个语言不可知论的问题。
我已经查过这里的相关问题了,它们在地面上很薄弱,答案也很小。例如:域模型中的验证和授权,并将其通过服务层传递给MVC
我正在阅读弹簧安全文档,它为它是一个横切的关注点提出了一些很好的论据,但我担心它只是“春天的方式”,并且希望有更广阔的视角。它还将应用程序与特定的框架联系在一起。
发布于 2014-11-11 14:35:16
我认为在您的服务层启用授权是绝对合理的方法。您需要保护您的服务不执行未经授权的活动(特别是数据修改)。您的服务层可以驻留在一个库中,并由不同的表示层使用(您可以有不同的UI应用程序,它们使用相同的服务层)。而且您不能依赖于特定的表示层执行必要的验证这一事实。如果您随后决定将您的服务层移动到单独的流程(例如,遵循SOA方法),这一点尤其重要。
现在,关于如何以“干净的方式”实现这一目标。我不喜欢在授权检查中乱扔业务逻辑的想法,所以一些面向方面的编程方法的具体实现可能会有所帮助:它可以是用特殊属性装饰服务方法,也可以是使用动态代理来拦截。
更重要的是,我必须承认,在非常简单的项目中,你可以在没有单独验证的情况下生活,只是为了简化你的生活。但重要的是不要错过“简单项目”开始变成“复杂项目”的那一刻。
发布于 2015-08-19 02:08:08
我喜欢把授权检查推低到他们可以去的地方!(但别再继续了!)
您仍然可以自由地编写针对“以上”层的自动授权测试。有些规则可能只适用于较高层,如服务层(CanView/CanSerialize?)。但是,我通常认为最安全的授权策略也是“最枯燥的”策略:尽可能低授权,尽可能使用最“通用”或“共享”的代码(而不是过于复杂的auth规则)。
想想另一种选择。如果您的授权规则仅在服务层中测试和强制执行,使您可怜的域对象屈从于喜怒无常的服务对象的意愿,那么您通常需要在每个对象中的多个对象和多个位置以及更复杂的代码中多次强制执行每个单独的规则。
此外,当您的分析团队雇用一家咨询公司使用您的域对象编写报告服务时,您不会想要信任那些开发人员!(或者别的什么。))以任何理由在相同对象上构建附加服务或调用。)您将不想翻开商业规则的大书,希望再次正确地执行这些规则;您希望您的领域已经知道并执行这些规则。
发布于 2021-12-25 09:02:33
这是将授权检查从控制器中推出来的最有可能的好方法。控制器只是给定应用程序表示层中许多可能的实现部分之一。
如果在表示层中实现了其他API,则需要在现有控制器中找到现有的相应安全检查,并复制它们--而不是重复。这种方法容易出错,对安全性和规则的执行没有很高的信心。
为了对安全性和可靠性有很高的信心,表示层应该只对应用程序的数据和业务逻辑使用安全的接口。
我喜欢从文章DDD,六角形,洋葱,清洁,CQRS,…我是怎么把这一切组合在一起的中画出的六角形建筑图:
在整个系统的高层视图中,它是可见的,应用程序有多个不同前端的部件(API)。因此,控制器应该是尽可能薄的层,并且只做最低限度的工作,以便以所需的形式访问应用程序。
https://softwareengineering.stackexchange.com/questions/262424
复制相似问题