Spring security 如何获取ExceptionTranslationFilter';s Bean定义由<;http>;
各位: 如何获取在3.0.x和3.1.x中创建的Spring security 如何获取ExceptionTranslationFilter';s Bean定义由<;http>;,spring-security,Spring Security,各位: 如何获取在3.0.x和3.1.x中创建的ExceptionTranslationFilter的BeanDefinition?我想重用beandeDefinition(accessDeniedHandler和authenticationEntryPoint)的属性值。我发现无法通过bean名称或类从DefaultListableBeanFactory获取它,似乎ExceptionTranslationFilter的BeanDefinition未注册 其他过滤器如UsernamePasswo
ExceptionTranslationFilter
的BeanDefinition
?我想重用beandeDefinition
(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());
因此,真正的问题是,获取core filter Exception Translation的accesDeniedHandlerBean定义的最佳方法是什么,因为:
每个
命名空间块始终创建一个
SecurityContextPersistenceFilter
,一个例外TranslationFilter
和一个过滤器安全接口
。这些都是固定的,不能更改
被替代品取代
您应该使用“传统”beanFilterChainProxy
(使用名称空间代理的名称“springSecurityFilterChain”),或者通过明确定义它们并在
中引用它们来访问ExceptionTranslationFilter
的属性:
AuthenticationEntryPoint
根据文档,实现取决于配置了哪些身份验证机制,所以选择一种您需要的身份验证机制。您想要获得的具体属性是什么<出于某种原因,代码>例外TranslationFilter
本身似乎是Spring Security的内部版本。我正在做一项集成工作。我想以编程方式注册一个使用相同PropertyValue的自定义BeanDefinition。我需要ExceptionTranslationFilter的accessDeniedHandler和authenticationEntryPoint。我发现我可以通过获取名为org.springframework.security.web.DefaultSecurityFi FilterChain#0的筛选器链bean来获取ExceptionTranslationFilter
。这个bean名称的命名规则是Spring中的内部规范吗?用户配置是否会覆盖此规则?我只是想保证,通过这种方式,我总能得到3.0.x和3.1.x版本的这个bean,而且它不易碎。谢谢。玩内部组件从来都不好,因为它们将来可能会改变。我想注册一个自定义异常筛选器的BeanDefinition
,我的异常筛选器使用与“accessDeniedHandler”相同的PropertyValue
。我不打算替换它。稍后我将附加一个psuedo代码`From:默认情况下,过滤器将使用AccessDeniedHandlerImpl。因此,您不是在替换accessDeniedHandler
,而是明确地定义它,以便在其他bean/代码中访问它——这就是您的方法。authenticationEntryPoint
也是如此,但它的实现依赖于其他过滤器,即`usesLoginUrlAuthenticationEntryPoint
。如果您真的想定义自定义ExceptionTranslationFilter
(根据Spring安全人员的说法,这是不必要的,因为他们修复了它),您将能够探测异常TranslationFilter
子类。我认为它是有效的。但我最终放弃了自己创建一个BeanDefinition
。因为我对春季安全不太了解。我只需要设计一个维护补丁。但是谢谢你的帮助。
<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>