ExceptionTranslationFilter

ExceptionTranslationFilter

大家:

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

其他过滤器(例如UsernamePasswordAuthenticationFilter)具有Bean名称:org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0。但是ExceptionTranslationFilter没有一个。

我发现的唯一方法是迭代搜索filterChainProxy的属性,还有更好的方法吗?

我在伪代码中做什么:

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的最佳方法是什么

最佳答案

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


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


您应该使用“传统” bean FilterChainProxy(使用名称空间代理的名称为“ springSecurityFilterChain”),也可以通过显式定义它们并在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>


根据文档,AuthenticationEntryPoint实现的设置取决于已配置的身份验证机制,因此请选择您需要的一种。

10-06 06:15