web-dev-qa-db-fra.com

Quel est le logiciel AuthenticationManager par défaut dans Spring-Security? Comment s'authentifie-t-il?

J'ai le haricot suivant défini:

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider
        user-service-ref="userDetailsService" />
</sec:authentication-manager>

Je suppose que Spring utilise une implémentation par défaut de AuthenticationManager.

Dans mon code Java, j'ai:

@Resource(name = "authenticationManager")
private AuthenticationManager authenticationManager; // specific for Spring Security

public boolean login(String username, String password) {
    try {
        Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
        if (authenticate.isAuthenticated()) {
            SecurityContextHolder.getContext().setAuthentication(authenticate);             
            return true;
        }
    }
    catch (AuthenticationException e) {         
    }
    return false;
}

Ici, AuthenticationManager.authenticate(...) est appelé. Mais j'aimerais savoir quelle implémentation de AuthenticationManager Spring utilise par défaut et ce que fait sa authenticate(...) pour s'authentifier (c'est-à-dire, assurez-vous que le nom d'utilisateur correspond au mot de passe).

Pourriez-vous expliquer cela?

47
rapt

La AuthenticationManager n'est en réalité qu'un conteneur pour les fournisseurs d'authentification, leur fournissant une interface cohérente. Dans most cas, la valeur par défaut AuthenticationManager est plus que suffisante.

Quand vous appelez 

.authenticate(new UsernamePasswordAuthenticationToken(username, password))`

il passe la UsernamePasswordAuthenticationToken à la valeur par défaut AuthenticationProvider, qui utilisera la userDetailsService pour obtenir l'utilisateur en fonction du nom d'utilisateur et le comparer avec le mot de passe du jeton d'authentification.

En général, le AuthenticationManager transmet une sorte de AuthenticationToken à chacun de ses AuthenticationProviders et ils l'inspectent chacun et, s'ils peuvent l'utiliser pour s'authentifier, ils renvoient avec l'indication "Authentifié", "Non authentifié" ou "Impossible d'authentifier "(ce qui indique que le fournisseur ne savait pas comment gérer le jeton, il est donc passé au traitement)

C'est le mécanisme qui vous permet de connecter d'autres schémas d'authentification, tels que l'authentification auprès d'un serveur LDAP ou Active Directory ou encore OpenID. Il s'agit de l'un des principaux points d'extension du cadre Spring Security.

59
cdeszaq

Spring Security ne fournit qu'une seule implémentation AuthenticationManager réelle: 

org.springframework.security.authentication.ProviderManager

Ceci utilise différents AuthenticationProvider pour les tâches d'authentification

La AuthenticationManagerBeanDefinitionParser est responsable de l'analyse <sec:authentication-manager> dans son document Java:

Enregistre le ProviderManager central utilisé par l'espace de noms configuration, et permet la configuration d'un alias, permettant à les utilisateurs doivent le référencer dans leurs haricots et voir clairement où se trouve le nom provenir de.

Il crée la ProviderManager et ajoute les fournitures spécifiées. Si aucune fourniture n'est spécifiée dans le fichier XML, elle ajoute alors une variable NullAuthenticationProvider. Il s’agit au moins d’un fournisseur notant simplement qu’empêcher les exceptions de configuration.

31
Ralph

De Spring Security Docs :

L’implémentation par défaut de Spring Security s’appelle ProviderManager. Plutôt que de gérer la demande d’authentification elle-même, elle délègue à une liste de AuthenticationProvider s configurés, chacun étant interrogé à tour de rôle pour authentification. Chaque fournisseur lève une exception ou retourne un objet Authentication entièrement rempli.

Des informations sur ProviderManager sont également disponibles dans Guide d'actualité - Architecture de sécurité Spring :

L'implémentation la plus utilisée de AuthenticationManager est ProviderManager, qui délègue à une chaîne de AuthenticationProvider les instances. Un AuthenticationProvider est un peu comme un AuthenticationManager mais il existe une méthode supplémentaire pour autoriser l'appelant pour savoir s'il supporte un type donné Authentication ...

0
I.Gandakov