2010-03-07 4 views
1

J'essaie de valider par programme un login/pass utilisateur en utilisant Spring Security, donc j'ai besoin d'avoir accès au ProviderManager. Je voudrais qu'il soit automatiquement injecté dans mon @Controller.Spring Security: autowire ProviderManager

Mon code ressemble:

import org.springframework.security.authentication.ProviderManager; 

// ... 

@Controller 
public class MyController { 

    @Autowired 
    private ProviderManager authenticationManager; 

Mais lorsque je tente de lancer l'application que je reçois ce message d'erreur:

No unique bean of type [org.springframework.security.authentication.ProviderManager] is defined: 
expected single matching bean but found 2: 
[org.springframework.security.authentication.ProviderManager#0, org.springframework.security.authenticationManager] 

Quelle pourrait être la cause ou comment pourrais-je le résoudre? J'utilise Spring Security 3.0.0-RC1 avec Spring 3.0.1, et je n'ai défini aucun bean ProviderManager. Je l'ai utilisé avec succès:

@Resource 
private ProviderManager authenticationManager; 

dans d'autres projets, mais javax.annotation.Resource est pas pris en charge dans GAE.

Répondre

9

Il y a deux AuthenticationManager s dans le contexte:

  • org.springframework.security.authenticationManager est peuplé avec les fournisseurs d'authentification explicitement déclarés dans <authentication-manager>
  • org.springframework.security.authentication.ProviderManager#0 est peuplée avec les fournisseurs implicitement déclarés (me souvenir, anonyme et ainsi de suite) et les délégués la demande d'authentification à org.springframework.security.authenticationManager en tant que solution de secours.

Donc, je suppose que vous avez besoin

@Autowired @Qualifier("org.springframework.security.authenticationManager") 
+0

Merci, je ne connaissais pas l'annotation @Qualifier. Savez-vous si elle est liée d'une manière ou d'une autre avec l'attribut "alias" () qui semble également résoudre le problème? –

+0

@Guido: Oui, votre solution fonctionne presque de la même manière. '@ Qualifier' utilise le nom spécifié pour choisir l'un des beans, lorsque votre solution choisit ce bean car son alias correspond au nom du champ. – axtavt

4

Le message d'erreur disparaît, y compris un alias pour le gestionnaire d'authentification:

<sec:authentication-manager alias="authenticationManager"> 

et l'amélioration de la sécurité Spring finale 3.0.0.