Implémentation de l'architecture

Nous avons vu le fonctionnement de Spring Security, nous allons maintenant mettre en oeuvre les trois différente partie de l'authentification :

  • Le manager AuthenticationManager
  • Le provider DAOAuthenticationProvider
  • Le security filter chain

Pour ce faire, nous allons développée une classe SecurityConfig que nous allons annoter avec @Configuration et @EnabledWebSecurity

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    /* manager */
    /* provider */
    /* security filter chain */
}

Créer un AuhenticationManager

L'implémentation par défaut, si nous ne précisons pas le AuthentificationManager Spring utilisera le ProviderManager. Ainsi le code permettant de fournir un AuthentificationManager à notre programme reste simple.

@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
    return authenticationConfiguration.getAuthenticationManager();
}

Créer un DAOAuthenticationProvider

Le DAOAuthenticationProvider à une dépendance vers un PasswordEncore et vers un UserDetailService que nous devons lui founir

@Bean
public AuthenticationProvider authenticationProvider(UserDetailsService userDetailsService , PasswordEncoder passwordEncoder) {
    DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
    daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
    daoAuthenticationProvider.setUserDetailsService(userDetailsService);
    return daoAuthenticationProvider;
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

Etant donné que nous avons besoin d'un passwwordEncoder nous devons créer un Bean spécifique. Concernant l'userDetailService il sera injecté via l'annotation que nous positionnerons sur la classe.

Créer une Security Filter Chain

Il ne nous reste plus qu'à définir la Security Filter Chain.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.csrf().disable()
                    .authorizeHttpRequests()
                    .antMatchers("/customer/auth/*").permitAll()
                    .anyRequest().authenticated();

        // Construction de la chaine
        return httpSecurity.build();
  }
}

Autoriser des requêtes sans authentification

Pour que l'utilisateur est la possibilité de créer un compte ou de se connecter nous devons autoriser les requête vers ces deux end-points :

  • .antMatchers("/customer/auth/*").permitAll() permet de dire que toutes requêtes provevant de /customer/auth/* n'ont pas besoin d'être authentifiées :
    • /customer/auth/login
    • /customer/auth/register

Interdire des requête aux utilisateurs non connectés

Néanmois, nous souhaitons que les autres pages soient accessibles seulement aux utilisateur connectés :

  • .anyRequest().authenticated() spécifie que seuls les utilisateurs authentifiés peuvent avoir accès à toutes autres ressources

Conclusion

En soit, cette classe nous permet de personnaliser comment Spring va gérer l'authentification. En effet, Spring fournit le mécanisme mais nous sommes libre de :

  • Préciser le fonctionnement de la SecurityFilterChain
  • Préciser l'AuthenticationManager à utiliser
  • Fournir un ou plusieurs AuthenticationProvider