3

我尝试了以下方法:

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

我正在使用弹簧 3.1.1。

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

4

2 回答 2

7

如果您只想获得有关身份验证事件的通知,那么您不必自定义AuthenticationManager. ApplicationListener实现如下所示的接口就够了,把一个这种类型的bean放在同一个配置了安全性的spring上下文中。

public class AuthenticationEventListener 
        implements ApplicationListener<AbstractAuthenticationEvent> {

    @Override
    public void onApplicationEvent(AbstractAuthenticationEvent event) {
        // process the event
    }
}
于 2013-04-10T13:01:52.390 回答
3

看看所涉及的基本 Java 接口。您正在创建一个类型为Providermanager(interface AuthenticationManager) 的 bean,并且您试图将其分配给应该是 type 的东西AuthenticationProvider,因此您会收到错误消息。

authentication-manager命名空间元素自己创建一个实例,因此ProviderManager您将在同一配置中拥有两个实例。

在最新版本的 Spring Security 中,您可以使用以下方式将自定义AuthenticationManager注入到 Web 配置中:

<http authentication-manager-ref="authenticationManager">
   ...

并完全绕过使用命名空间AuthenticationManager

于 2013-04-10T13:05:24.613 回答