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