我有一个具有弹簧安全性的Web应用程序,默认情况下所有页面都需要授权。在我的场景中,管理员可以在某个时候决定禁用某些页面的安全性或完全禁用它。怎么能最好地实现?我正在考虑修改FilterChainProxy
,但我不清楚(getFilterChains()
如何返回不可修改的列表)?
答案 0 :(得分:3)
子类DelgatingFilterProxy
并检查是否调用该委托的标志。
然后在web.xml中使用它代替DelegatingFilterProxy
使用的springSecurityFilterChain
(假设您正在使用命名空间配置)。例如:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>com.foo.spring.MyDelegatingFilterProxy</filter-class>
</filter>
在DelegatingFilterProxy中检查一个标志(例如,系统属性)以查看是否应该委派。
class MyDelegatingFilterProxy extends DelegatingFilterProxy {
override def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
if (System.getProperty("skipSpringSecurity" != null) {
// Ignore the DelegatingProxyFilter delegate
chain.doFilter(request, response)
} else {
// Call the delegate
super.doFilter(request, response, chain)
}
}
}
您可以使用相同的技术来使用像<security:intercept-url pattern="/**" access="ROLE_USER" />
这样的毯子通配符,然后跳过针对/(对于静态文件等)的一些路径调用Spring Security过滤器。
答案 1 :(得分:0)
如何配置Spring安全性?您可以选择添加一个自定义权限评估器来验证您的条件吗?
查看spring-security writing a custom PermissionEvaluator - how to inject a DAO service?