2013-04-10 61 views
2

我試過如下:如何捕獲認證事件?

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

任何想法爲什麼會引發此錯誤?或者有關如何捕獲認證事件的其他建議?謝謝。

回答

4

如果您只想獲得關於認證事件的通知,那麼您無需自定義AuthenticationManager。這足以實現如下所示的ApplicationListener接口,並將該類型的bean放置在配置了安全性的同一個spring上下文中。

public class AuthenticationEventListener 
     implements ApplicationListener<AbstractAuthenticationEvent> { 

    @Override 
    public void onApplicationEvent(AbstractAuthenticationEvent event) { 
     // process the event 
    } 
} 
+0

是的,我得到了這個解決方案,它的工作原理。謝謝。 – cid 2013-04-11 08:32:43

3

看看所涉及的基本Java接口。您正在創建一個類型爲Providermanager(接口AuthenticationManager)的bean,並且您正在嘗試將其分配給應該是AuthenticationProvider類型的東西,因此您會收到錯誤消息。

authentication-manager namespace元素本身創建一個ProviderManager實例,因此您將在同一配置中擁有兩個實例。使用命名空間爲AuthenticationManager完全

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

和旁路:

在Spring Security的最新版本,你可以注入定製AuthenticationManager到使用web配置。