Authentification de base de sécurité Spring

Authentification de base de Spring Security

1. Vue d'ensemble

Ce tutoriel montre comment installer, configurer et personnaliserBasic Authentication with Spring. Nous allons construire au-dessus des simplesSpring MVC example et sécuriser l'interface utilisateur de l'application MVC avec le mécanisme d'authentification de base fourni par Spring Security.

2. La configuration de sécurité Spring

Nous pouvons configurer Spring Security à l'aide de la configuration Java:

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password(passwordEncoder().encode("user1Pass"))
          .authorities("ROLE_USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/securityNone").permitAll()
          .anyRequest().authenticated()
          .and()
          .httpBasic()
          .authenticationEntryPoint(authenticationEntryPoint);

        http.addFilterAfter(new CustomFilter(),
          BasicAuthenticationFilter.class);
    }

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

Ici, nous utilisons l'élémenthttpBasic() pour définir l'authentification de base, à l'intérieur de la méthodeconfigure() d'une classe qui étendWebSecurityConfigurerAdapter.

La même chose pourrait être obtenue en utilisant XML aussi:



    
    



    
        
            
        
    

Ce qui est pertinent ici, c'est l'élément<http-basic> à l'intérieur de l'élément principal<http> de la configuration - cela suffit pour activer l'authentification de base pour l'ensemble de l'application. Le gestionnaire d'authentification n'est pas l'objet de ce didacticiel. Nous utilisons donc un gestionnaire en mémoire avec l'utilisateur et le mot de passe définis en texte brut.

Lesweb.xml de l'application Web activant Spring Security ont déjà été abordés dans lesSpring Logout tutorial.

3. Consommation de l'application sécurisée

La commandecurl est notre outil incontournable pour consommer l'application sécurisée.

Tout d'abord, essayons de demander les/homepage.html sans fournir d'informations d'identification de sécurité:

curl -i http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

On récupère les401 Unauthorized etthe Authentication Challenge attendus:

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 1061
Date: Wed, 29 May 2013 15:14:08 GMT

Le navigateur interpréterait ce défi et nous demanderait des informations d'identification avec une simple boîte de dialogue, mais comme nous utilisonscurl, ce n'est pas le cas.

Maintenant, demandons la même ressource - la page d'accueil - maisprovide the credentials pour y accéder également:

curl -i --user user1:user1Pass
  http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

Maintenant, la réponse du serveur est200 OK avec unCookie:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 90
Date: Wed, 29 May 2013 15:19:38 GMT

À partir du navigateur, l'application peut être utilisée normalement. La seule différence est qu'une page de connexion n'est plus une exigence puisque tous les navigateurs prennent en charge l'authentification de base et utilisent une boîte de dialogue pour demander à l'utilisateur des informations d'identification.

4. Configuration supplémentaire - Le point d'entrée

Par défaut, leBasicAuthenticationEntryPoint provisionné par Spring Security renvoie une page complète pour une réponse401 Unauthorized au client. Cette représentation HTML de l'erreur est bien rendue dans un navigateur, mais elle ne convient pas à d'autres scénarios, tels qu'une API REST où une représentation json peut être préférée.

L'espace de noms est suffisamment flexible pour cette nouvelle exigence également - pour y remédier - le point d'entrée peut être remplacé:

Le nouveau point d'entrée est défini comme un haricot standard:

@Component
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {

    @Override
    public void commence(
      HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
      throws IOException, ServletException {
        response.addHeader("WWW-Authenticate", "Basic realm="" + getRealmName() + """);
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter writer = response.getWriter();
        writer.println("HTTP Status 401 - " + authEx.getMessage());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        setRealmName("example");
        super.afterPropertiesSet();
    }
}

En écrivant directement dans la réponse HTTP, nous avons maintenant un contrôle total sur le format du corps de la réponse.

5. Les dépendances Maven

Les dépendances Maven pour Spring Security ont déjà été discutées dans leSpring Security with Maven article - nous aurons besoin despring-security-web etspring-security-config disponibles au moment de l'exécution.

6. Conclusion

Dans cet exemple, nous avons sécurisé une application MVC avec Spring Security et Basic Authentication. Nous avons discuté de la configuration XML et avons utilisé l’application avec de simples commandes curl. Enfin, vous avez pris le contrôle du format exact du message d'erreur, en passant de la page d'erreur HTML standard à un texte personnalisé ou au format JSON.

L'implémentation complète de ce didacticiel se trouve dansthe GitHub project - il s'agit d'un projet basé sur Maven, 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: