Spring security 如何获取ExceptionTranslationFilter';s Bean定义由<;http>;

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

各位:

如何获取在3.0.x和3.1.x中创建的
ExceptionTranslationFilter
BeanDefinition
?我想重用
beandeDefinition
accessDeniedHandlerauthenticationEntryPoint)的
属性值。我发现无法通过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的accesDeniedHandler
Bean定义的最佳方法是什么,因为:

每个
命名空间块始终创建一个
SecurityContextPersistenceFilter
,一个
例外TranslationFilter
和一个
过滤器安全接口
。这些都是固定的,不能更改 被替代品取代

您应该使用“传统”bean
FilterChainProxy
(使用名称空间代理的名称“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
也是如此,但它的实现依赖于其他过滤器,即`uses
LoginUrlAuthenticationEntryPoint
。如果您真的想定义自定义
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>