我一直在我的控制器方法上使用带有@PreAuthorize 的spring security。我的理由是,我希望授权检查在一层中以可预测的方式发生,并且在请求中尽可能早地发生。但是,我刚刚阅读了 spring security 3 文档,并看到他们建议在服务层上应用方法级别的安全性(但他们没有说明原因)。
我的问题是:spring security方法级别的注解应该应用在控制器层还是服务层?(或“两者”,或“视情况而定”?)更重要的是:为什么?
我一直在我的控制器方法上使用带有@PreAuthorize 的spring security。我的理由是,我希望授权检查在一层中以可预测的方式发生,并且在请求中尽可能早地发生。但是,我刚刚阅读了 spring security 3 文档,并看到他们建议在服务层上应用方法级别的安全性(但他们没有说明原因)。
我的问题是:spring security方法级别的注解应该应用在控制器层还是服务层?(或“两者”,或“视情况而定”?)更重要的是:为什么?
“这取决于” :)。如果您的应用程序有一个服务层,通过该服务层应用您的所有业务逻辑,那么这通常是一个干净的地方来应用您的安全约束并确保您没有错过任何极端情况。
Web 代码通常比较混乱,数量更多,变化更快,最终您可能会从多个地方调用相同的服务方法。有人可能会添加一个新控制器而忘记正确保护它。或者,您可能有不同类型的客户端调用相同的服务。
但这取决于您的应用程序的结构以及您的用例是什么。对于为什么要保护控制器,您可能有一个很好的论据。
考虑代码重用。您打算在其他地方使用您的服务吗?不只是为了满足您的网络层?我们还通过 jms 桥重用我们的服务,因此我们保护了我们的服务层。
我认为该服务是使用它的更好地方。
尽管可能会在Controller上产生一些问题,并且 Spring Security FAQ建议将这种注释放在 Service 上,但我理解某些操作的授权更多的是业务规则,而不是 Web 层的责任。@PreAuthorize