Introduction à Java Config pour Spring Security

1. Vue d'ensemble

Cet article est une introduction à la configuration Java pour Spring Security qui permet aux utilisateurs de configurer facilement Spring Security sans utiliser XML .

La configuration Java a été ajoutée au framework Spring dans Spring 3.1 et étendue à Spring Security dans Spring 3.2 et est définie dans une classe annotée @Configuration .

2. Configuration de Maven

Pour utiliser Spring Security dans un projet Maven, nous devons d'abord avoir la dépendance spring-security-core dans le projet pom.xml :

 org.springframework.security spring-security-core 5.3.3.RELEASE 

La dernière version peut toujours être trouvée ici.

3. Sécurité Web avec configuration Java

Commençons par un exemple de base de configuration Java Spring Security:

@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user") .password(passwordEncoder().encode("password")).roles("USER"); } }

Comme vous l'avez peut-être remarqué, la configuration met en place une configuration d'authentification en mémoire de base. De plus, à partir du printemps 5, nous avons besoin d'un bean PasswordEncoder :

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

4. Sécurité HTTP

Pour activer la sécurité HTTP au printemps, nous devons étendre WebSecurityConfigurerAdapter pour fournir une configuration par défaut dans la méthode configure (HttpSecurity http) :

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().httpBasic(); } 

La configuration par défaut ci-dessus garantit que toute demande adressée à l'application est authentifiée avec une connexion basée sur un formulaire ou une authentification de base HTTP.

En outre, il est exactement similaire à la configuration XML suivante:

5. Connexion par formulaire

Fait intéressant, Spring Security génère automatiquement une page de connexion, basée sur les fonctionnalités activées et en utilisant des valeurs standard pour l'URL qui traite la connexion soumise:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().formLogin() .loginPage("/login").permitAll(); }

Ici, la page de connexion générée automatiquement est pratique pour démarrer rapidement.

6. Autorisation avec rôles

Configurons maintenant une autorisation simple sur chaque URL à l'aide de rôles:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").access("hasRole('USER')") .antMatchers("/admin/**").hasRole("ADMIN") .and() // some more method calls .formLogin(); }

Remarquez comment nous utilisons à la fois l'API de type sécurisé - hasRole - mais également l'API basée sur les expressions, via l' accès.

7. Déconnexion

Comme de nombreux autres aspects de Spring Security, la déconnexion a quelques excellents paramètres par défaut fournis par le framework.

Par défaut, une demande de déconnexion invalide la session, efface les caches d'authentification, efface le SecurityContextHolder et redirige vers la page de connexion.

Voici une configuration de déconnexion simple:

protected void configure(HttpSecurity http) throws Exception { http.logout(); }

Cependant, si vous souhaitez avoir plus de contrôle sur les gestionnaires disponibles, voici à quoi ressemblera une implémentation plus complète:

protected void configure(HttpSecurity http) throws Exception { http.logout().logoutUrl("/my/logout") .logoutSuccessUrl("/my/index") .logoutSuccessHandler(logoutSuccessHandler) .invalidateHttpSession(true) .addLogoutHandler(logoutHandler) .deleteCookies(cookieNamesToClear) .and() // some other method calls }

8. Authentification

Jetons un coup d'œil à une autre façon d'autoriser l'authentification avec Spring Security.

8.1. Authentification en mémoire

Nous allons commencer par une configuration simple en mémoire:

@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

8.2. Authentification JDBC

Pour déplacer cela vers JDBC, tout ce que vous avez à faire est de définir une source de données dans l'application - et de l'utiliser directement:

@Autowired private DataSource dataSource; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .withDefaultSchema() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

Bien sûr, avec les deux exemples ci-dessus, nous devons également définir le bean PasswordEncoder comme indiqué dans la section 3.

9. Conclusion

Dans ce tutoriel rapide, nous avons passé en revue les bases de la configuration Java pour Spring Security et nous nous sommes concentrés sur les exemples de code qui illustrent les scénarios de configuration les plus simples.