【问题标题】:Should spring security method level annotations be applied at the controller layer or the service layer?spring安全方法级别注解应该应用在控制器层还是服务层?
【发布时间】:2013-01-15 14:59:10
【问题描述】:

我一直在我的控制器方法上使用带有 @PreAuthorize 的 Spring Security。我的理由是,我希望授权检查在一层中以可预测的方式发生,并且在请求中尽可能早地发生。但是,我刚刚阅读了 spring security 3 文档,并看到他们建议在服务层上应用方法级别的安全性(但他们没有说明原因)。

我的问题是:spring security方法级别的注解应该应用在控制器层还是服务层? (或“两者”,还是“视情况而定”?)更重要的是:为什么?

【问题讨论】:

    标签: spring-security


    【解决方案1】:

    “这取决于”:)。如果您的应用程序有一个服务层,通过该服务层应用您的所有业务逻辑,那么这通常是一个干净的地方来应用您的安全约束并确保您没有错过任何极端情况。

    Web 代码通常比较混乱,代码更多,变化更快,最终您可能会从多个地方调用相同的服务方法。有人可能会添加一个新控制器而忘记正确保护它。或者,您可能有不同类型的客户端调用相同的服务。

    但这取决于您的应用程序的结构以及您的用例是什么。对于为什么要保护控制器,您可能有一个很好的论据。

    【讨论】:

    • 谢谢,您提到了为服务设置安全性的好理由。您认为保护控制器的好理由是什么?同样对于上下文,我想到的应用程序基本上每个控制器端点都有一个服务方法,因为我的服务定义了事务边界。所以同一个服务方法只从一个地方调用,没有其他客户端使用该服务。
    • 我想到的对服务进行授权的另一个原因是,谁可以访问什么服务的问题可能是一个业务决策,因此可以通过业务逻辑来定位。
    • 在我的脑海中,我没有任何好的论据来保护控制器而不是服务层。这并不意味着它们在特定情况下可能不存在。您的需求可能会根据通常仅在 Web 层中可用的数据指定规则,例如请求标头。
    • @ShauntheSheep 为什么“Web 代码通常比较混乱”? “Web 代码”是指仅 Rest 控制器还是其他东西?因为我的应用程序中的其余控制器比服务更简单。特别是,因为我的应用只是后端,它没有 UI(UI 在其他 webapp 中)
    • @Zhenyria 我认为在这个问题的上下文中,“网络代码”指的是通过 MVC 控制器呈现网页的 UI 代码。
    【解决方案2】:

    从代码重用的角度考虑。您打算在其他地方使用您的服务吗?不只是为了满足您的网络层? 我们还通过 jms 网桥重用我们的服务,从而保护我们的服务层。

    【讨论】:

    • 这是一个值得考虑的好点,谢谢。对于这种特殊情况,该服务仅用于为 Web 层提供数据。
    【解决方案3】:

    我认为服务是使用它的更好地方。

    尽管some problems@PreAuthorizecould createController 和 Spring Security 常见问题解答recommendation 将这种注释放在服务上,我了解某些操作的授权与其说是网络层的责任,不如说是业务规则。

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 2011-10-02
      • 2018-12-30
      • 2013-07-01
      • 1970-01-01
      • 2011-02-11
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多