我尝试了以下内容:
<bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
<property name="providers">
<list>
<ref local="myAuthnProvider"/>
</list>
</property>
<property name="authenticationEventPublisher">
<bean class="myPublisher/>
</property>
</bean>
<security:authentication-manager>
<security:authentication-provider ref="authenticationManager" />
</security:authentication-manager>
但我在启动时遇到异常。我也尝试了构造函数标记,结果相同:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authenticationManager': Could not resolve matching constructor (hint: secify index/type/name arguments for simple parameters to avoid type ambiguities)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:250)
我正在使用spring 3.1.1。
为什么抛出此错误的任何想法?或者有关如何捕获身份验证事件的其他建议?感谢。
答案 0 :(得分:6)
如果要获取有关身份验证事件的通知,则无需自定义AuthenticationManager
。它足以实现如下所示的ApplicationListener
接口,并将这种类型的bean放在配置安全性的相同spring环境中。
public class AuthenticationEventListener
implements ApplicationListener<AbstractAuthenticationEvent> {
@Override
public void onApplicationEvent(AbstractAuthenticationEvent event) {
// process the event
}
}
答案 1 :(得分:3)
查看所涉及的基本Java接口。您正在创建类型为Providermanager
的bean(接口AuthenticationManager
),并且您正在尝试将其分配给类型为AuthenticationProvider
的类型,因此您会收到错误。
authentication-manager
名称空间元素本身会创建一个ProviderManager
实例,因此您将在同一配置中拥有两个实例。
在最新版本的Spring Security中,您可以使用以下命令将自定义AuthenticationManager
注入Web配置:
<http authentication-manager-ref="authenticationManager">
...
并完全绕过AuthenticationManager
的命名空间。