Introduction à Java Config pour Spring Security

Introduction à Java Config pour Spring Security

1. Vue d'ensemble

Cet article estan introduction to Java configuration for Spring Security qui permet aux utilisateurs de configurer facilement Spring Security sans utiliser XML.

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

2. Maven Setup

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


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

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

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("password").roles("USER");
    }
}

Comme vous l'avez peut-être remarqué, la configuration configure une configuration de base pour l'authentification en mémoire.

4. Sécurité HTTP

Pour activer la sécurité HTTP au printemps, nous devons étendre lesWebSecurityConfigurerAdapter pour fournir une configuration par défaut dans la méthodeconfigure(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

Il est intéressant de noter que Spring Security génère automatiquement une page de connexion, basée sur les fonctionnalités activées et 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 être rapidement opérationnel.

6. Autorisation avec rôles

Configurons maintenant une autorisation simple sur chaque URL à l'aide des 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 des expressions, viaaccess.

7. Se déconnecter

Comme de nombreux autres aspects de Spring Security, la déconnexion a quelques grands défauts fournis par le framework.

Par défaut, une demande de déconnexion invalide la session, efface tous les caches d'authentification, efface lesSecurityContextHolder 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 mieux contrôler 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

Voyons maintenant une autre façon de permettre 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("password").roles("USER")
      .and()
      .withUser("admin").password("password").roles("USER", "ADMIN");
}

8.2. Authentification JDBC

Pour transférer cela dans JDBC, il vous suffit 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("password").roles("USER")
      .and()
      .withUser("admin").password("password").roles("USER", "ADMIN");
}

9. Conclusion

Dans ce rapide didacticiel, 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 illustrant les scénarios de configuration les plus simples.