我必须从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?
答案 0 :(得分:4)
如果您提供了有关要删除的过滤器以及原因的更多详细信息,那可能会有所帮助。
如果您愿意,可以在创建过滤器链后使用BeanPostProcessor
修改过滤器链。在默认命名空间配置中,您可以为<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。
以下是指向real-world example和its configuration的链接。
答案 1 :(得分:1)
您可以在SpringSecurity配置中通过 filter-chain-map 标记定义自己的过滤器链:
<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<security:filter-chain-map>
<sec:filter-chain pattern="/**"
filters="
ConcurrentSessionFilterAdmin,
securityContextPersistenceFilter,
logoutFilterAdmin,
.....
anonymousAuthenticationFilter,
sessionManagementFilterAdmin,
exceptionTranslationFilter,
filterSecurityInterceptorAdmin,
MonitoringFilter"/>
</security:filter-chain-map>
</bean>