1. AuthenticationManager
1.1.1. La signature de AuthenticationManager
L'interface AuthenticationManager a un rôle central pour l'authentification au sein d' une application dont la sécurité est gérée par Spring Security ; cette interface reçoit les requêtes des filtres et délègue la validation des informations des utilisateurs (login et password) aux fournisseurs d'authentification (AuthenticationProvider ) disponibles; AuthenticationProvider gère un ou plusieurs fournisseurs d'authentification.
AuthenticationManager peut être considérée comme un coordinateur qui enregistre plusieurs fournisseurs et, en fonction du type de demande, envoie la requête d'authentification au bon fournisseur; l'interface AuthenticationManager possède une seule méthode appelée authenticate et a comme signature:
public interface AuthenticationManager { Authentication authenticate (Authentication authentication) throws AuthenticationException; }
La méthode "authenticate" a un paramétre de type Authentication qui est une interface et retourne une réponse de type Authentication ; cette façon de faire (voir le cours de java) nous permet de ne pas figer la façon dont l'interface Authentication sera implémentée.
.....
1.1.2. Exemple d'utilisation de AuthenticationManager
......
@Configuration
@EnableWebSecurity
public class SecurityConfig {
...... ....... @Bean public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); return authenticationManagerBuilder.build(); } .....
}
........
Pour Spring Security, une configuration rapide des détails des utilisateurs en mémoire, pour JDBC , LDAP ou pour l'ajout de UserDetailsService personnalisé, on se sert de AuthenticationManagerBuilder, L'exemple suivant montre une application qui configure l'AuthentificationManager global (parent) :
@Configuration public class ApplicationSecurity extends WebSecurityConfigurerAdapter { ...
// ce qui concerne le web par exemple @Autowired public void initialize(AuthenticationManagerBuilder builder, DataSource dataSource) {
builder.jdbcAuthentication().dataSource(dataSource).withUser("omara") .password("secret").roles("USER"); } }
......
......
1.2. AuthenticationProvider
L'interface AuthenticationProvider dérive de l'interface AuthentificationManager; L'implémentation courante de AuthenticationProvider est la classe ProviderManager ; AuthenticationProvider a une méthode supplémentaire par rapport à AuthenticationProvider pour permettre à l'appelant de demander s'il prend en charge une "Authentication" type donné car AuthenticationProvider traite des types spécifiques d’authentification; elle possède deux méthodes :
la méthode authenticate effectue l'authentification avec la demande et la méthode supports vérifie si le fournisseur prend en charge le type d'authentification indiqué. La signature de AuthenticationProvider est :
public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); }
L'argument Class<?> dans la méthode supports() est en réalité Class<? extends Authentication> (on lui demande uniquement s'il prend en charge quelque chose qui est transmis à la méthode Authenticate()). Un objet de type ProviderManager peut prendre en charge plusieurs mécanismes d'authentification différents dans la même application en déléguant à une chaîne de AuthenticationProviders. Si un ProviderManager ne reconnaît pas un type d’instance d’authentification particulier, ce dernier est ignoré.
Un ProviderManager a un parent facultatif, qu'il peut consulter si tous les fournisseurs renvoient null. Si le parent n'est pas disponible, une authentification nulle entraîne une AuthenticationException.
Parfois, une application dispose de groupes logiques de ressources protégées (par exemple, toutes les ressources Web qui correspondent à un modèle de chemin, tel que /api/**), et chaque groupe peut avoir son propre AuthenticationManager dédié. Souvent, chacun d’eux est un ProviderManager et ils partagent un parent. Le parent est alors une sorte de ressource « globale », agissant comme une ressource de secours pour tous les prestataires.
Une implémentation importante de l'interface souvent utilisé dans des projets est DaoAuthenticationProvider , qui récupère les informations de l'utilisateur à partir d'une implémentation de l'interface UserDetailsService.
1.3. Interface UserdetailsService
L'interface UserDetailsService est décrit comme une interface principale qui charge des données spécifiques à l'utilisateur .
Dans la plupart des cas d'utilisation, AuthenticationProvider permet d'extraire les informations relatives aux utilisateurs en fonction des informations d'identification stockées dans une base de données, pour pouvoir effectuer la validation. Ce cas d'utilisation étant si courant, les développeurs Spring Security ont décidé de définir UserDetailsService en tant qu'interface distincte qui expose la méthode unique "loadUserByUsername" qui accepte le nom d'utilisateur comme paramètre et renvoie l'objet d'identité de l'utilisateur.
.....