首页 > 解决方案 > 根据 applicationContext.xml 中的条件向 spring-security 过滤器链添加过滤器 bean

问题描述

我们有一个 spring-security 过滤器链,如下所示,我们在 applicationContext.xml 中为每个 url 模式提供过滤器列表

    <bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> <constructor-arg index="0">
        <list>
            <security:filter-chain pattern="/rest" filters="
                sessionContextIntegrationFilter,
                ${bean.loggingFilter},
                ${bean.basicProcessingFilter},`

现在,有没有办法根据条件向这个链添加过滤器?类似于下面使用 SpEL 的东西

"#{'${some.condition}'.equalsIgnoreCase('true') ? actualFilter: dummyFilter}" />

在不使用注释或配置文件的情况下,请提出一个可以在同一个 xml 文件中实现的解决方案。

更新:我在发布这个问题之前尝试了下面的代码,但它对我不起作用,但根据@RG 的评论,它看起来应该可以工作。请指出错误的地方(为简单起见,我将条件替换为“真”)

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> <constructor-arg index="0">
<list>
    <security:filter-chain pattern="/rest" filters="
        sessionContextIntegrationFilter,
        ${bean.loggingFilter},
        ${bean.basicProcessingFilter},
        #{ 'true' == 'true' ? 'actualFilter' : 'dummyFilter' }"/>
</list></constructor-arg>
</bean>

标签: javaspringspring-security

解决方案


以下将根据条件在过滤器 bean 之间切换

    <bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> <constructor-arg index="0">
    <list>
        <security:filter-chain pattern="/rest" filters="
            sessionContextIntegrationFilter,
            ${bean.loggingFilter},
            ${bean.basicProcessingFilter},
            #{ some.condition == 'true' ? 'actualFilter' : 'dummyFilter' }"/>
    </list></constructor-arg>
    </bean>

推荐阅读