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

Haw*_*awk 3 spring-security

大家:

我怎样才能获得ExceptionTranslationFilterBeanDefinition在3.0.x和3.1.X产生的?我想重用它PropertyValueBeanDefinition(accessDeniedHandlerauthenticationEntryPoint).我发现我无法DefaultListableBeanFactory通过bean名称或类来获取它,似乎没有注册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());
Run Code Online (Sandbox Code Playgroud)

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

Xae*_*ess 6

因为您无法更改ExceptionTranslationFilter实施或有权访问它:

每个<http>命名空间块总是创建一个 SecurityContextPersistenceFilter,一个ExceptionTranslationFilter 和一个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>
Run Code Online (Sandbox Code Playgroud)

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