Authentification de base Spring Security

1. Vue d'ensemble

Ce didacticiel montre comment configurer, configurer et personnaliser l' authentification de base avec Spring . Nous allons nous appuyer sur l'exemple simple de Spring MVC 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ément httpBasic () pour définir l'authentification de base, dans la méthode configure () d'une classe qui étend WebSecurityConfigurerAdapter.

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

Ce qui est pertinent ici, c'est le élément à l'intérieur du principal élément 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.

Le fichier web.xml de l'application Web activant Spring Security a déjà été abordé dans le tutoriel Spring Logout.

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

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

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

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

Nous récupérons les 401 non autorisés attendus et le défi d'authentification:

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 puisque nous utilisons curl , ce n'est pas le cas.

Maintenant, demandons la même ressource - la page d'accueil - mais fournissons également les informations d' identification pour y accéder:

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

Maintenant, la réponse du serveur est 200 OK avec un cookie :

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

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

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

Par défaut, le BasicAuthenticationEntryPoint provisionné par Spring Security renvoie une page complète pour une réponse 401 non autorisée au client. Cette représentation HTML de l'erreur rend bien dans un navigateur, mais elle n'est pas bien adaptée pour 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 également suffisamment flexible pour cette nouvelle exigence - pour y remédier - le point d'entrée peut être remplacé:

Le nouveau point d'entrée est défini comme un bean 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 + getRealmName() + """); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); PrintWriter writer = response.getWriter(); writer.println("HTTP Status 401 - " + authEx.getMessage()); } @Override public void afterPropertiesSet() throws Exception { setRealmName("Baeldung"); 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 de Maven

Les dépendances Maven pour Spring Security ont déjà été discutées dans l'article Spring Security with Maven - nous aurons besoin à la fois de spring-security-web et de spring-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 l'authentification de base. Nous avons discuté de la configuration XML et nous avons utilisé l'application avec de simples commandes curl. Enfin, a 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 dans le projet GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.

Lorsque le projet s'exécute localement, l'exemple HTML est accessible à l'adresse:

// localhost: 8080 / spring-security-rest-basic-auth / api / foos / 1.