Web安全和方法安全是保护应用程序的两种不同方法,请参阅
Spring Security Reference
:
为什么不直接使用web.xml安全性呢?
假设您正在开发基于Spring的企业应用程序。您通常需要解决四个安全问题:身份验证、web请求安全、服务层安全(即实现业务逻辑的方法)和域对象实例安全(即不同的域对象具有不同的权限)。考虑到这些典型要求:
-
Web请求安全性:
servlet规范提供了一种保护请求URI的方法。但是,这些URI只能用servlet规范自己的有限URI路径格式表示。SpringSecurity提供了一种更全面的方法。例如,您可以使用ANT路径或正则表达式,您可以考虑URI的部分而不仅仅是所请求的页面(例如,您可以考虑HTTP GET参数),并且可以实现自己的运行时配置数据源。这意味着您的web请求安全性可以在实际执行webapp期间动态更改。
-
服务层和域对象安全性:
A.
关注点的分离:
授权是一个贯穿各领域的问题,因此应予以实施。实现授权代码的MVC控制器或视图使得测试控制器和授权逻辑更加困难,调试更加困难,并且经常会导致代码重复。
B
对富客户端和web服务的支持:
如果最终必须支持其他客户端类型,则嵌入在web层中的任何授权代码都是不可重用的。应该考虑到SpringRemoting导出程序只导出服务层bean(而不是MVC控制器)。因此,授权逻辑需要位于服务层中,以支持多种客户端类型。
C
分层问题:
D
授权代码质量:
人们常说web框架“使做正确的事情变得更容易,而做错误的事情变得更难”。安全框架是相同的,因为它们是以一种抽象的方式设计的,用于广泛的目的。从头开始编写自己的授权代码并不能提供框架所提供的“设计检查”,内部授权代码通常缺乏广泛部署、同行评审和新版本所带来的改进。
Spring Security Reference
10.1.4请求匹配和HttpFirewall
[...]
实际上,我们建议您在服务层使用方法安全性来控制对应用程序的访问,并且不要完全依赖于使用在web应用程序级别定义的安全约束。URL会发生变化,很难考虑应用程序可能支持的所有可能的URL以及如何处理请求。你应该试着限制自己使用一些简单易懂的蚂蚁路径。始终尝试使用“默认拒绝”方法,在这种方法中,您最后定义了一个catch-all通配符(/或),并拒绝访问。
在服务层定义的安全性更健壮,更难绕过,因此您应该始终利用Spring Securitys的方法安全选项。
Spring Security Reference
:
我已经将SpringSecuritys元素添加到我的应用程序上下文中,但是如果我将安全注释添加到我的SpringMVC控制器bean(Struts操作等),那么它们似乎没有效果。
通常,我们建议在服务层而不是在单个web控制器上应用方法安全性。