大家:
如何获得在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的属性,还有更好的方法吗?
我在伪代码中做什么:
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>
名称空间块始终创建一个
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>
根据文档,
AuthenticationEntryPoint
实现的设置取决于已配置的身份验证机制,因此请选择您需要的一种。