4

每个人:

如何在 3.0.x 和 3.1.x 中创建ExceptionTranslationFilter's ?BeanDefinition我想重用它PropertyValueBeanDefinitionaccessDeniedHandlerauthenticationEntryPoint)。我发现我无法DefaultListableBeanFactory通过bean名称或类获取它,似乎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

4

1 回答 1

6

因为您无法更改ExceptionTranslationFilter实现或访问它

每个<http>命名空间块总是创建一个 SecurityContextPersistenceFilter、一个ExceptionTranslationFilter 和一个FilterSecurityInterceptor。这些是固定的,不能用替代品代替。

您应该使用“传统”bean (使用命名空间代理的名称“springSecurityFilterChain”)或通过显式定义它们并在中引用它们来FilterChainProxy访问的属性: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根据文档,实现是根据已配置的身份验证机制设置的,因此请选择您需要的一个。

于 2012-08-29T10:22:58.907 回答