Connexion au formulaire de sécurité du printemps

Connexion au formulaire de sécurité du printemps

1. introduction

Cet article va se concentrer surLogin with Spring Security. Nous allons nous appuyer sur les simplesprevious Spring MVC example, car c'est une partie nécessaire de la configuration de l'application Web avec le mécanisme de connexion.

Lectures complémentaires:

Spring Security - Rediriger vers l'URL précédente après la connexion

Petit exemple de redirection après la connexion à Spring Security

Read more

Deux pages de connexion avec Spring Security

Un guide rapide et pratique sur la configuration de Spring Security avec deux pages de connexion distinctes.

Read more

Connexion au formulaire de sécurité du printemps

Exemple de connexion Spring - Comment configurer un formulaire de connexion simple, une configuration XML de sécurité de base et quelques autres techniques de configuration avancées.

Read more

2. Les dépendances Maven

Pour ajouter des dépendances Maven au projet, veuillez consulter lesSpring Security with Maven article. Lesspring-security-web etspring-security-config standard seront nécessaires.

3. Configuration Java de Spring Security

Commençons par créer une classe de configuration Spring Security qui étendWebSecurityConfigurerAdapter. En ajoutant@EnableWebSecurity, nous obtenons la prise en charge de l'intégration Spring Security et MVC:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
          .and()
          .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
          .and()
          .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
          .csrf().disable()
          .authorizeRequests()
          .antMatchers("/admin/**").hasRole("ADMIN")
          .antMatchers("/anonymous*").anonymous()
          .antMatchers("/login*").permitAll()
          .anyRequest().authenticated()
          .and()
          .formLogin()
          .loginPage("/login.html")
          .loginProcessingUrl("/perform_login")
          .defaultSuccessUrl("/homepage.html", true)
          //.failureUrl("/login.html?error=true")
          .failureHandler(authenticationFailureHandler())
          .and()
          .logout()
          .logoutUrl("/perform_logout")
          .deleteCookies("JSESSIONID")
          .logoutSuccessHandler(logoutSuccessHandler());
    }

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

Dans cet exemple, nous avons utilisé l'authentification en mémoire et défini 3 utilisateurs.

Passons maintenant en revue les éléments que nous avons utilisés pour créer la configuration de connexion par formulaire.

3.1. authorizeRequests()

Nous autorisons l'accès anonyme sur/login afin que les utilisateurs puissent s'authentifier. Nous sécurisons également tout le reste.

Notez que l'ordre des élémentsantMatchers() est significatif -the more specific rules need to come first, followed by the more general ones.

3.2. formLogin()

Il existe plusieurs méthodes que nous pouvons utiliser pour configurer le comportement du login de formulaire:

  • loginPage() – lescustom login page

  • loginProcessingUrl() - l'url à laquelle soumettre le nom d'utilisateur et le mot de passe

  • defaultSuccessUrl() - la page de destination après une connexion réussie

  • failureUrl() - la page de destination après une connexion infructueuse

3.3. Gestionnaire d'authentification

Le fournisseur d'authentification est soutenu par une implémentation simple en mémoire -InMemoryUserDetailsManager spécifiquement. Ceci est utile pour le prototypage rapide lorsqu'un mécanisme de persistance complet n'est pas encore nécessaire.

Starting with Spring 5, we also have to define a password encoder. Dans notre exemple, nous avons utilisé lesBCryptPasswordEncoder.

4. Ajouter une sécurité Spring à l'application Web

Pour utiliser la configuration Spring Security définie ci-dessus, vous devez l'associer à l'application Web. Dans ce cas, nous n'avons besoin d'aucunweb.xml:

public class AppInitializer
  extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class[] getRootConfigClasses() {
        return new Class[] {SecSecurityConfig.class};
    }
}

Notez que cet initialiseur n'est pas nécessaire si nous utilisons une application Spring Boot. Consultez notre article surSpring Boot security auto-configuration pour plus de détails sur la façon dont la configuration de sécurité est chargée dans Spring Boot.

5. La configuration XML de Spring Security

Jetons également un œil à la configuration XML correspondante.

Le projet global utilise la configuration Java, nous devons donc importer le fichier de configuration XML via une classe Java@Configuration:

@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
   public SecSecurityConfig() {
      super();
   }
}

Et la configuration XML de Spring Security -webSecurityConfig.xml:


    
    

    
    



    
        
            
        
        
    



6. Lesweb.xml

Avant l'introduction de Spring 4, nous avions l'habitude de configurer la configuration de Spring Security dans lesweb.xml - seul un filtre supplémentaire ajouté aux Spring MVCweb.xml standard:

Spring Secured Application






    springSecurityFilterChain
    org.springframework.web.filter.DelegatingFilterProxy


    springSecurityFilterChain
    /*

Le filtre -DelegatingFilterProxy - délègue simplement à un bean géré par Spring - leFilterChainProxy - qui lui-même est capable de bénéficier d'une gestion complète du cycle de vie de Spring bean et autres.

7. Le formulaire de connexion

La page du formulaire de connexion va être enregistrée avec Spring MVC en utilisant le mécanisme simple pourmap views names to URLs sans avoir besoin d'un contrôleur explicite entre:

registry.addViewController("/login.html");

Ceci, bien sûr, correspond auxlogin.jsp:




   

Login

User:
Password:

LeSpring Login form a les artefacts pertinents suivants:

  • login - l'URL où le formulaire est POSTÉ pour déclencher le processus d'authentification

  • username - le nom d'utilisateur

  • password - le mot de passe

8. Configuration supplémentaire de Spring Login

Nous avons brièvement discuté de quelques configurations du mécanisme de connexion lorsque nous avons présenté la configuration de sécurité Spring ci-dessus - entrons maintenant dans les détails.

Une des raisons de remplacer la plupart des valeurs par défaut de Spring Security est dehide the fact that the application is secured with Spring Security et de minimiser les informations qu'un attaquant potentiel connaît sur l'application.

Entièrement configuré, l'élément de connexion ressemble à ceci:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()
      .loginPage("/login.html")
      .loginProcessingUrl("/perform_login")
      .defaultSuccessUrl("/homepage.html",true)
      .failureUrl("/login.html?error=true")
}

Ou la configuration XML correspondante:

8.1. La page de connexion

Voyons ensuite comment nous pouvons configurer une page de connexion personnalisée à l'aide desloginPage() method:

http.formLogin()
  .loginPage("/login.html")

Ou, via la configuration XML:

login-page='/login.html'

Si nous ne le spécifions pas, Spring Security générera un formulaire de connexion très basique à l'URL de/login.

8.2. L'URL POST pour la connexion

L'URL par défaut sur laquelle la connexion Spring POST pour déclencher le processus d'authentification est/login qui était auparavant/j_spring_security_check avantSpring Security 4.

Nous pouvons utiliser la méthodeloginProcessingUrl pour remplacer cette URL:

http.formLogin()
  .loginProcessingUrl("/perform_login")

Ou, via la configuration XML:

login-processing-url="/perform_login"

Une bonne raison de remplacer cette URL par défaut est de masquer le fait que l'application est réellement sécurisée avec Spring Security - ces informations ne doivent pas être disponibles en externe.

8.3. La page de destination du succès

Une fois le processus de connexion réussi, l'utilisateur est redirigé vers une page, qui est par défaut la racine de l'application Web.

Nous pouvons remplacer cela via la méthodedefaultSuccessUrl():

http.formLogin()
  .defaultSuccessUrl("/homepage.html")

Ou avec la configuration XML:

default-target-url="/homepage.html"

Sialways-use-default-target est défini sur true, l'utilisateur est toujours redirigé vers cette page. Si cet attribut est défini sur false, l'utilisateur sera redirigé vers la page précédente qu'il souhaitait consulter avant d'être invité à s'authentifier.

8.4. La page de destination sur l'échec

Comme pour la page de connexion, la page d'échec de connexion est générée automatiquement par Spring Security à/login?error par défaut.

Pour remplacer cela, nous pouvons utiliser la méthodefailureUrl():

http.formLogin()
  .failureUrl("/login.html?error=true")

Ou avec XML:

authentication-failure-url="/login.html?error=true"

9. Conclusion

Dans ceSpring Login Example, nous avons configuré un processus d'authentification simple - nous avons discuté du formulaire de connexion Spring Security, de la configuration de la sécurité et de certaines des personnalisations les plus avancées disponibles.

L'implémentation de ce tutoriel Spring Login peut être trouvée dansthe GitHub project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.

Lorsque le projet est exécuté localement, vous pouvez accéder à l'exemple HTML à l'adresse suivante:

http://localhost:8080/spring-security-mvc-login/login.html