如何获取由<http> </http>创建的ExceptionTranslationFilter的BeanDefinition

时间:2012-08-29 07:43:05

标签: spring-security

大家:

如何在3.0.x和3.1.x中创建ExceptionTranslationFilter BeanDefinition?我想重用其PropertyValue BeanDefinition accessDeniedHandler authenticationEntryPoint )。我发现我无法通过bean名称或类从DefaultListableBeanFactory获取它,似乎没有注册ExceptionTranslationFilter的BeanDefinition。

其他过滤器,如UsernamePasswordAuthenticationFilter,它有一个bean名称: org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0 。但是ExceptionTranslationFilter没有。

我找到的唯一方法是迭代搜索filterChainProxy的属性,有没有更好的方法?

我在psuedo代码中做了什么:

BeanDefinitionBuilder builder = 
    BeanDefinitionBuilder.rootBeanDefinition(MyExceptionFilter.class);
RootBeanDefinition exceptionTranslationFilter = getExceptionTranslationFilterBeanDefinition();     
PropertyValue accessDeniedHandler = exceptionTranslationFilter.getPropertyValues().getPropertyValue("accessDeniedHandler");
Object handler = (RootBeanDefinition) accessDeniedHandler.getValue();
builder.addPropertyValue("accessDeniedHandler", handler);
beanDefinitionRegistry.registerBeanDefinition("myFilter", builder.getBeanDefinition());

所以,真正的问题是获取核心过滤器的最佳方法ExceptionTranslation的accesDeniedHandler BeanDefinition

1 个答案:

答案 0 :(得分:6)

因为you can't change ExceptionTranslationFilter implementation or have access to it

  

每个<http>命名空间块始终创建一个   SecurityContextPersistenceFilterExceptionTranslationFilter   和FilterSecurityInterceptor。这些是固定的,不可能   替换为替代品。

你应该使用“传统”bean FilterChainProxy(使用命名空间代理的名称“springSecurityFilterChain”)或通过明确定义它们并在{{1}中引用它们来获取对ExceptionTranslationFilter属性的访问权限}:

<http>
根据文档,

<http entry-point-ref="authenticationEntryPoint"> <access-denied-handler ref="accessDeniedHandler" /> <!-- other options --> </http> <bean:bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> <bean:property name="loginFormUrl" value="/login.htm"/> </bean:bean> <bean:bean id="accessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl"> <bean:property name="errorPage" value="/accessDenied.htm" /> </bean:bean> 实现根据已配置的身份验证机制设置,因此选择一个您需要的。