2009-07-23 10 views
3

Actuellement, j'écris une application Web à l'aide de Spring Security. Nous avons un service web qui authentifie les utilisateurs par nom d'utilisateur et mot de passe.Authentifier les utilisateurs avec SpringSecurity à l'aide d'un WebService nécessitant un nom d'utilisateur et un mot de passe

service Web:
String[] login(String username, String password);

Comment configurer Spring Security pour passer le nom d'utilisateur et mot de passe fourni au service Web?

J'ai écrit un UserDetailsService qui ne reçoit qu'un nom d'utilisateur.


Je pense que le problème est avec votre fichier XML. Avez-vous désactivé l'auto-config? Et votre classe étend-elle AbstractUserDetailsAuthenticationProvider?

Répondre

4

Étendre org.acegisecurity.providers.dao.AbstractUserDetailsAuthenticationProvider

/** 
* @author rodrigoap 
* 
*/ 
public class WebServiceUserDetailsAuthenticationProvider extends 
    AbstractUserDetailsAuthenticationProvider { 

    @Override 
    protected UserDetails retrieveUser(String username, 
     UsernamePasswordAuthenticationToken authentication) 
     throws AuthenticationException { 
    //Improve this line: 
    String password = authentication.getCredentials().toString(); 
    // Invoke your webservice here 
    GrantedAuthority[] grantedAuth = loginWebService.login(username, password); 
    // create UserDetails. Warning: User is deprecated! 
    UserDetails userDetails = new User(username, password, grantedAuth); 
    return userDetails; 
    } 

} 
0

L'idée avec UserDetailsService est que votre implémentation fournit un objet UserDetails représentant l'utilisateur avec ce nom d'utilisateur, et Spring Security gère la vérification des informations d'identification.

Si ce type de conception ne fonctionne pas correctement avec votre backend, car vous avez besoin du mot de passe en tant que paramètre, vous devrez peut-être envisager d'implémenter votre propre AuthenticationProvider.

4

Je l'ai écrit à la classe suivante:

PncUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider

qui met en œuvre la Methode recieveUser:

@Override 
protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken token) throws AuthenticationException { 
    try { 
     server = (PncUtilRemote) new InitialContext().lookup("PncUtilBean"); 
     if (server != null) { 
      String password = SHA1(token.getCredentials().toString()); 
      String[] auth = server.login(username, password); 
      if (auth.length > 0) { 
       PncUserDetails details = new PncUserDetails(username, password); 
       for (int i = 0; i < auth.length; i++) { 
        details.addAuthority(auth[i]); 
       } 
       return details; 
      } 
     } 
    } catch (Exception e) { 
     System.out.println("! " + e.getClass().getName() + " in com.logica.pnc.security.PncUserDetailsAuthenticationProvider.retrieveUser(String, UsernamePasswordAuthenticationToken): " + e.getMessage()); 
    } 
    throw new BadCredentialsException(""); 
} 

Pour activer votre AuthenticationProvider vous devez ajouter quelques lignes à votre fichier application context.xml:

 
<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager"> 
    <property name="providers"> 
     <list><ref local="PncAuthenticationProvider" /></list> 
    </property> 
</bean> 

<bean id="PncAuthenticationProvider" class="com.logica.pnc.security.PncUserDetailsAuthenticationProvider"> 
    <security:custom-authentication-provider /> 
</bean> 

Il est important que vous définissez l'auto-config false:

 
<security:http auto-config="false" /> 

Merci à rodrigoap pour pointer vers le thingy AuthenticationProvider :)

Questions connexes