在基于 Spring Security 3.2 的应用程序中,我有一个显式配置UsernamePasswordAuthenticationFilter
,需要参考sessionAuthenticationStrategy
(为了调用.onAuthentication
).*
The sessionAuthenticationStrategy
是默认创建的<security:http>
(HttpSecurityBeanDefinitionParser
).
我的问题:我怎样才能获得参考SessionAuthenticationStrategy
无需配置完整的SessionAuthenticationStrategy
显式的,以便我可以在 XML 配置中注入这个引用?
<security:http auto-config="false" use-expressions="true"
entry-point-ref="loginUrlAuthenticationEntryPoint"
access-decision-manager-ref="httpAccessDecisionManager">
...
<security:custom-filter
ref="usernamePasswordAuthenticationFilter"
position="FORM_LOGIN_FILTER"/>
...
</security:http>
...
<bean id="usernamePasswordAuthenticationFilter"
class=" o.s.scurity.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="sessionAuthenticationStrategy" ref="????"> <!-- ?? ->
...
</bean>
*我真实的UsernamePasswordAuthenticationFilter
是一个定制的子类,但这对于这个问题来说应该不重要
我已经看过了HttpSecurityBeanDefinitionParser
(以及HttpConfigurationBuilder.createSessionManagementFilters()
)这是负责解析的类security:http
标签并用于创建SessionAuthenticationStrategy
bean.
因此我知道 Spring Security 3.2.5.RELEASE 创建(在我的配置中)CompositeSessionAuthenticationStrategy
bean 并使用它作为会话策略。该 bean 将获得默认名称:org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy#0
所以我当前的解决方法是通过名称引用该 bean:
<bean id="usernamePasswordAuthenticationFilter"
class=" o.s.scurity.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="sessionAuthenticationStrategy">
<ref
bean="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy#0"/>
</property>
...
</bean>
此解决方法有一些严重的局限性:
- 当较新版本的 spring security 以其他方式工作(创建其他 bean)时,它将失败。
- 当有另一个的时候
CompositeSessionAuthenticationStrategy
这就是名字的创建者ReaderContext.generateBeanName
那么这种方法可能会失败,因为#0
也许成为#1
(取决于创建 Bean 的顺序)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)