[JAVA] Définissez le résultat de l'authentification Spring Security sur JSON

introduction

J'ai essayé de savoir comment renvoyer le résultat de l'authentification par formulaire dans JSON avec Spring Security.

La version que j'ai vérifiée est la suivante.

Version
Java 1.8
Spring Boot 1.5.10.RELEASE

Exemple de code

Code de la théorie. Veuillez d'abord consulter l'exemple de code.

JsonAuthConfigurer.java


package example;

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

@Configuration
public class JsonAuthConfigurer extends WebSecurityConfigurerAdapter
    implements AuthenticationSuccessHandler, AuthenticationFailureHandler {
  private static final MediaType CONTENT_TYPE_JSON = MediaType.APPLICATION_JSON_UTF8;

  @Autowired
  MappingJackson2HttpMessageConverter httpMessageConverter;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.formLogin() //Définir l'authentification par formulaire
        .successHandler(this) //Spécification du gestionnaire lorsque l'authentification est réussie
        .failureHandler(this); //Spécification du gestionnaire lorsque l'authentification échoue
    http.authorizeRequests().anyRequest().authenticated(); //Définition des demandes nécessitant une authentification
  }


  // ------------------------------
  // AuthenticationSuccessHandler
  // ------------------------------

  @Override
  public void onAuthenticationSuccess(HttpServletRequest request,
                                      HttpServletResponse response,
                                      Authentication authentication) throws IOException {
    MyResult result = new MyResult("Authentification réussie"); //L'objet doit être JSON
    HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
    httpMessageConverter.write(result, CONTENT_TYPE_JSON, outputMessage); //Écrire à la réponse
    response.setStatus(HttpStatus.OK.value()); // 200 OK.
  }

  // ------------------------------
  // AuthenticationFailureHandler
  // ------------------------------

  @Override
  public void onAuthenticationFailure(HttpServletRequest request,
                                      HttpServletResponse response,
                                      AuthenticationException exception) throws IOException {
    MyResult result = new MyResult("Échec d'authentification"); //L'objet doit être JSON
    HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
    httpMessageConverter.write(result, CONTENT_TYPE_JSON, outputMessage); //Écrire à la réponse
    response.setStatus(HttpStatus.UNAUTHORIZED.value()); // 401 Unauthorized.
  }


  // ------------------------------

  /**Résultat d'authentification*/
  @lombok.Value
  public static class MyResult {
    private final String message;
  }

}

Pour rendre la réponse JSON

Il semble que vous devriez écrire JSON dans le contenu de la réponse avec successHandler [^ fqcn-s] et failureHandler [^ fqcn-f]. En outre, en cas d'échec de l'authentification, l'état est défini sur «401 Non autorisé».

Tips Étant donné que le processus de conversion de Response en JSON s'est terminé facilement, voici quelques conseils que j'ai remarqués après avoir essayé diverses choses.

MappingJackson2HttpMessageConverter Lors de l'écriture de JSON dans le contenu de la réponse, il est pratique d'utiliser MappingJackson2HttpMessageConverter ''. Il ajoutera également automatiquement Content-Type: application / json; charset = UTF-8 '' à l'en-tête.

Mappage automatiqueJackson2HttpMessageConverter


@Autowired
MappingJackson2HttpMessageConverter httpMessageConverter;

Ecrire JSON


httpMessageConverter.write(result, CONTENT_TYPE_JSON, outputMessage);

En passant, si vous écrivez à Response par vous-même, ce sera comme suit. [^ quote-1]

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
  response.getWriter().write(new ObjectMapper().writeValueAsString(new UserAuthenticationResponse(authentication.getName(), 123l)));
  response.setStatus(200);
}

Implémentation de l'interface du gestionnaire

Comme indiqué dans l'exemple de code ci-dessus, l'implémentation des interfaces de divers gestionnaires dans la classe d'implémentation WebSecurityConfigurer rendra le code plus propre.

Extrait d'une partie propre


@Configuration
public class JsonAuthConfigurer extends WebSecurityConfigurerAdapter
    implements AuthenticationSuccessHandler, AuthenticationFailureHandler {
    //↑ Parce que le gestionnaire est implémenté dans cette classe...

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()
        .successHandler(this) //← L'argument de la spécification du gestionnaire peut être ceci
        .failureHandler(this); //← L'argument de la spécification du gestionnaire peut être ceci
  }

  //...
}

en conclusion

Il s'agit de la troisième série de certification. Les articles précédents sont les suivants.

J'ai l'impression de m'habituer au printemps.

Recommended Posts

Définissez le résultat de l'authentification Spring Security sur JSON
À propos de l'authentification Spring Security
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Authentification / autorisation de mémo d'utilisation de Spring Security
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Implémentez la fonction d'authentification avec Spring Security ③
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Comment configurer Spring Boot + PostgreSQL
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Découvrez l'architecture de traitement de l'authentification Spring Security
Certification / autorisation avec Spring Security & Thymeleaf
Authentification DB avec Spring Security et hachage avec BCrypt
Obtenez une authentification BASIC avec Spring Boot + Spring Security
[Inverser] Spring Security (mis à jour de temps en temps)
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
Ajoutez vos propres éléments d'authentification avec Spring Security
Spring Boot - Comment définir le délai d'expiration de la session
Comment définir l'injection de dépendance Spring Boot (DI)
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
Créer une authentification par clé API pour l'API Web dans Spring Security
Réglez RSpec sur DRY
Un nouvel employé a tenté de créer une fonction d'authentification / autorisation à partir de zéro avec Spring Security
Spring Security soulève 403 interdits
Authentifiez 3 paramètres ou plus au format JSON à l'aide de Spring Security
Créez une API pour envoyer et recevoir des données Json avec Spring
Configurer le résolveur en plusieurs parties pour permettre à Spring de télécharger des fichiers
Comment configurer un proxy avec authentification dans Feign