Spring security spring安全方法级别的注释应该应用于控制器层还是服务层?

Spring security spring安全方法级别的注释应该应用于控制器层还是服务层?,spring-security,Spring Security,我在我的控制器方法上使用了带有@PreAuthorize的spring安全性。我的理由是,我希望授权检查在一个层中以可预测的方式进行,并在请求中尽早进行。然而,我刚刚阅读了SpringSecurity3文档,看到他们建议在服务层应用方法级安全性(但他们没有说明原因) 我的问题是:spring安全方法级别的注释应该应用于控制器层还是服务层?(或“两者”或“视情况而定”)更重要的是:为什么?“视情况而定”:。如果您的应用程序有一个应用所有业务逻辑的服务层,那么这通常是一个应用安全约束的干净地方,并且

我在我的控制器方法上使用了带有@PreAuthorize的spring安全性。我的理由是,我希望授权检查在一个层中以可预测的方式进行,并在请求中尽早进行。然而,我刚刚阅读了SpringSecurity3文档,看到他们建议在服务层应用方法级安全性(但他们没有说明原因)

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

“视情况而定”:。如果您的应用程序有一个应用所有业务逻辑的服务层,那么这通常是一个应用安全约束的干净地方,并且确保您没有错过任何关键案例

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


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

从代码重用的角度考虑。你打算在别处使用你的服务吗?不仅仅是为了满足您的web层?
我们还使用jms桥重用我们的服务,因此我们保护了我们的服务层。

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


尽管启用了
@PreAuthorize
和Spring安全常见问题解答来将此类注释放到服务上,但我知道某些操作的授权更像是一项业务规则,而不是web层的责任。

谢谢,您提到了在服务上设置安全性的好理由。你认为什么是保证控制器安全的好理由?同样对于上下文,我想到的应用程序基本上每个控制器端点都有一个服务方法,因为我的服务定义了事务边界。因此,同一个服务方法只从一个地方调用,没有其他客户使用该服务。我考虑对该服务进行授权的另一个原因是,谁可以访问什么服务可能是一个业务决策,因此可以根据业务逻辑进行定位。在我的脑海中,我没有任何好的论据支持优先保护控制器而不是服务层。这并不意味着它们在特定情况下可能不存在。您的需求可能会根据通常仅在web层可用的数据指定规则,例如,请求头。这是一个值得考虑的问题,谢谢。对于这种特殊情况,该服务仅用于向web层提供信息。