Spring Security filterChainProxy?!?!声明所有过滤器只使用一个自定义过滤器?

时间:2013-02-27 14:52:57

标签: spring security

我不确定filterChainProxy,我的spring安全性在我的应用程序中工作正常,但我需要从属性文件中加载ConfigAttributes ..

我知道我需要de创建类实现FilterInvocationSecurityMetadataSource ..然后我做了..之后

当我读到这篇文章时......我在文档中看到我必须在应用程序上下文xml上声明filterchaeinProxy ..就像这样......

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
  <constructor-arg>
    <list>
       <sec:filter-chain pattern="/**" filters="
           securityContextPersistenceFilterWithASCTrue,
           formLoginFilter,
           exceptionTranslationFilter,
           filterSecurityInterceptor" />
    </list>
  </constructor-arg>
</bean>

我是否真的需要声明所有这些过滤器只使用一个自定义过滤器?

我想从属性文件中提取我的网址和相应的角色..

1 个答案:

答案 0 :(得分:1)

来自文档部分"Adding in Your Own Filters"的引用:

  

请注意,您无法替换使用<http>元素本身创建的过滤器 - SecurityContextPersistenceFilterExceptionTranslationFilterFilterSecurityInterceptor

如果您想自定义这三个过滤器中的一个,那么您必须自己定义整个链。


对你来说可能已经太晚了,但就像这个问题的后续行动一样:你可以应用以下不那么漂亮的黑客来定制命名空间配置创建的FilterSecurityInterceptor,以避免手动创建整个过滤器链。

创建一个除了在其构造函数中收到的CustomSecurityMetadataSource上设置FilterSecurityInterceptor外无需执行任何操作的类。

public class FilterSecurityInterceptorInitializer {
    @Autowired
    public FilterSecurityInterceptorInitializer(
            FilterSecurityInterceptor filterSecurityInterceptor,
            CustomSecurityMetadataSource securityMetadataSource) {
        filterSecurityInterceptor
            .setSecurityMetadataSource(securityMetadataSource);
    }
}

然后在您的上下文中包含此初始化程序类:

<bean class="FilterSecurityInterceptorInitializer" autowire="constructor"/>
<bean class="CustomSecurityMetadataSource"/>