2013-04-10 3 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) 

Я использую весну 3.1.1.

Любые идеи, почему эта ошибка возникает? Или другие предложения по захвату событий аутентификации? Благодарю.

ответ

4

Если все, что вы хотите сделать, уведомляется об аутентификационных событиях, тогда вам не нужно настраивать AuthenticationManager. Достаточно реализовать интерфейс ApplicationListener, как показано ниже, и поместить компонент этого типа в тот же весенний контекст, в котором настроена безопасность.

public class AuthenticationEventListener 
     implements ApplicationListener<AbstractAuthenticationEvent> { 

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

Да, я добрался до этого решения, и оно работает. Благодарю. – cid

3

Взгляните на основные интерфейсы Java. Вы создаете компонент типа Providermanager (интерфейс AuthenticationManager), и вы пытаетесь присвоить его тому, что должно быть типа AuthenticationProvider, следовательно вы получите сообщение об ошибке.

Элемент пространства имен authentication-manager создает сам экземпляр ProviderManager, поэтому у вас есть два экземпляра в той же конфигурации.

В последних версиях Spring Security, вы можете вводить пользовательские AuthenticationManager в веб-конфигурации с помощью:

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

и шунтирование с использованием пространства имен для AuthenticationManager полностью.

Смежные вопросы