如何在Spring Security中从默认过滤器堆栈中删除一个过滤器?

我必须从Spring

Security堆栈中排除一个默认过滤器。因此,所有过滤器都应照常工作。看来我找到了解决方法,请创建自定义FilterChainProxy:

public class CustomFilterChainProxy extends FilterChainProxy {

Logger LOGGER = Logger.getLogger(CustomFilterChainProxy.class);

public CustomFilterChainProxy() {

super();

LOGGER.debug("Run custom filter proxy");

LOGGER.debug("String filters: " + this.toString());

}

public CustomFilterChainProxy(SecurityFilterChain chain) {

super(chain);

LOGGER.debug("Run custom filter proxy with chains");

}

}

如您所见,它具有获取过滤器列表的构造函数,因此我将能够根据需要从链中删除一个过滤器,其余所有过滤器将照常工作。但是我不能在这样的构造函数的安全配置中制作bean。如果我用

<bean id="filterChainProxy" class="com.pkg.CustomFilterChainProxy">

当然,使用默认构造函数构建对象。好的,我尝试用一​​些过滤器列表制作bean:

<bean id="filterChainProxy" class="ru.olekstra.backoffice.util.CustomFilterChainProxy">

<constructor-arg>

<list>

<sec:filter-chain pattern="/**"

filters="BasicUserApprovalFilter" />

</list>

</constructor-arg>

</bean>

但这不会编译,导致BasicUserApprovalFilter是未知的bean。那么如何从默认过滤器堆栈中排除一个过滤器呢?如果我使用自定义过滤器链代理的方法是一个好的决定,那么如何使用默认过滤器链创建bean?

回答:

如果您提供了有关要删除的过滤器及其原因的更多详细信息,可能会有所帮助。

如果需要,可以BeanPostProcessor在创建过滤器链后使用a对其进行修改。在默认的名称空间配置中,可以给<http>元素创建的过滤器链命名:

<http name="myFilterChain">

...

这将SecurityFilterChain使用该名称注册类型的Bean 。将FilterChainProxy可以从这些列表创建的。

后处理器看起来像:

public class SecurityFilterChainPostProcessor implements BeanPostProcessor {

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

if (beanName.equals("myFilterChain")) {

DefaultSecurityFilterChain fc = (DefaultSecurityFilterChain)bean;

List<Filter> filters = fc.getFilters();

// Modify the filter list as you choose here.

List<Filter> newFilters = ...

return new DefaultSecurityFilterChain(fc.getRequestMatcher(), newFilters);

}

return bean;

}

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

return bean;

}

}

然后只需在您的应用程序上下文中注册此bean的一个实例,其余的工作将由Spring完成。这样,您可以避免将所有Spring

Security基础结构过滤器定义为单独的bean。

回答:

这里是一个链接真实世界的例子和它的配置。

以上是 如何在Spring Security中从默认过滤器堆栈中删除一个过滤器? 的全部内容, 来源链接: utcz.com/qa/424961.html

回到顶部