2010-08-08 3 views
0

J'essaie de comprendre une application Spring 3.0 qui contient l'implémentation BeanPostProcessor suivante. À quoi sert ce code? Je pensais que le UserDetailsService était suffisant pour obtenir et définir les informations du compte de l'utilisateur.Pourquoi ce BeanPostProcessor est-il nécessaire en plus d'un UserDetailsService dans cet exemple d'authentification Spring 3.0?

@Service 
public class UserPassAuthFilterBeanPostProcessor implements BeanPostProcessor 
{ 

    /** 
    * The username parameter. 
    */ 
    private String usernameParameter; 

    /** 
    * The password parameter. 
    */ 
    private String passwordParameter; 

    @Override 
    public final Object postProcessAfterInitialization(final Object bean, final String beanName) 
    { 
     return bean; 
    } 

    @Override 
    public final Object postProcessBeforeInitialization(final Object bean, final String beanName) 
    { 
     if (bean instanceof UsernamePasswordAuthenticationFilter) 
     { 
      final UsernamePasswordAuthenticationFilter filter = (UsernamePasswordAuthenticationFilter) bean; 
      filter.setUsernameParameter(getUsernameParameter()); 
      filter.setPasswordParameter(getPasswordParameter()); 
     } 

     return bean; 
    } 

    /** 
    * Sets the username parameter. 
    * 
    * @param usernameParameter 
    *   the username parameter 
    */ 
    public final void setUsernameParameter(final String usernameParameter) 
    { 
     this.usernameParameter = usernameParameter; 
    } 

    /** 
    * Gets the username parameter. 
    * 
    * @return the username parameter 
    */ 
    public final String getUsernameParameter() 
    { 
     return usernameParameter; 
    } 

    /** 
    * Sets the password parameter. 
    * 
    * @param passwordParameter 
    *   the password parameter 
    */ 
    public final void setPasswordParameter(final String passwordParameter) 
    { 
     this.passwordParameter = passwordParameter; 
    } 

    /** 
    * Gets the password parameter. 
    * 
    * @return the password parameter 
    */ 
    public final String getPasswordParameter() 
    { 
     return passwordParameter; 
    } 

} 

Répondre

2

Oui, UserDetailsService est suffisant. BeanPostProcessor modifie les noms des paramètres de nom d'utilisateur et de mot de passe dans la demande de connexion (ie les noms des champs dans le formulaire de connexion) - ces propriétés ne peuvent pas être configurées via la configuration de l'espace de noms. laid mais pratique assez courante.

+0

Désolé si c'est une question stupide mais comment savez-vous que les noms de paramètres sont en cours de modification? –

+0

@pnut: Dans la documentation de UsernamePasswordAuthenticationFilter (http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.html), propriétés dont est modifié après l'instanciation par ce post-processeur. – axtavt

1

Cette méthode postProcessBeforeInitialization() est mis en œuvre à partir de l'interface BeanPostProcessor qui exécute automatiquement après votre getter et setter fin d'exécution et une fois l'exécution de la méthode finish postProcessBeforeInitialization(), les objets sont initialisés et postProcessAfterInitialization() exécutera.

Ce sont quelque chose comme les méthodes de cycle de vie.