大家:
如何在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
答案 0 :(得分:6)
因为you can't change ExceptionTranslationFilter
implementation or have access to it:
每个
<http>
命名空间块始终创建一个SecurityContextPersistenceFilter
,ExceptionTranslationFilter
和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>
实现根据已配置的身份验证机制设置,因此选择一个您需要的。