如何捕获身份验证事件?

时间:2013-04-10 11:05:12

标签: spring-security

我尝试了以下内容:

<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。

为什么抛出此错误的任何想法?或者有关如何捕获身份验证事件的其他建议?感谢。

2 个答案:

答案 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的命名空间。