[JAVA] Utiliser l'authentification de base avec Spring Boot

introduction

D'une manière ou d'une autre, je l'ai écrit dans un style pour SIer. L'environnement est également Java 1.7.

Aperçu

La méthode d'authentification de base dans Spring Boot est expliquée à l'aide d'un exemple de code. En supposant que la scène d'utilisation soit WebAPI, le paramètre est défini pour prendre en charge la communication sans état.

Environnement prérequis

version

Version
Java 1.7
Spring Boot 1.5.9.RELEASE

Dépendances

Exemple de code

Réglage

Définissez les paramètres suivants dans JavaConfig. Voir les commentaires dans le code source pour les paramètres spécifiques.

MyConfigure.java


@Configuration
public class MyConfigure extends WebSecurityConfigurerAdapter {

  // ----------------------------------------
  //Paramètres de sécurité Spring
  // ----------------------------------------

  // <<<* Veuillez noter que WebSecurityConfigurerAdapter a plusieurs méthodes de configuration de surcharge.>>>
  @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { super.configure(auth); }
  @Override public    void configure(WebSecurity                  web)  throws Exception { super.configure(web); }
  //---

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    //Paramètres d'authentification de base
    http.httpBasic().realmName("My sample realm");
    //Définition des demandes nécessitant une authentification
    http.authorizeRequests().anyRequest().authenticated();
    //Si les mesures CSRF sont activées, POST sans jeton entraînera une erreur, alors désactivez-le.
    http.csrf().disable();
    //Les informations d'identification sont toujours récupérées à partir de l'en-tête d'autorisation, éliminant ainsi le besoin de gestion de session de cookie
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  }

  // ----------------------------------------
  //Définition du haricot
  // ----------------------------------------

  @Bean
  public UserDetailsService userDetailsService() {
    return new LoginPrincipal.LoginPrincipalService();
  }

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

}

Informations d'authentification

Les informations d'identification sont définies comme une classe qui implémente ʻUserDetails [^ fqdn-1](LoginPrincipal`). Cette classe doit être conçue en gardant à l'esprit les points suivants.

Basé sur ce qui précède, cet exemple a la conception suivante.

-Maintenez le "login ID" dans * nom d'utilisateur *

ʻEn définissant la classe d'implémentation de UserDetailsService [^ fqdn-2] comme bean, vous pouvez définir l'implémentation lorsque Spring Security recherche des informations d'identification (LoginPrincipal.LoginPrincipalService). Cette classe est définie comme une classe interne de LoginPrincipal` pour la simplification du code.

Dans la classe LoginPrincipal.DB, le traitement factice est défini pour permettre à l'exemple de code de fonctionner seul.

LoginPrincipal.java


// ======================================================================
//* Classe d'implémentation UserDetails
// ======================================================================
public class LoginPrincipal extends org.springframework.security.core.userdetails.User {
  // ※loginId(Identifiant de connexion)Est super.Conserver le nom d'utilisateur
  private final String employeeNumber; //numéro d'employé

  public LoginPrincipal(String loginId, String employeeNumber, String encodedPassword, String[] roles) {
    super(loginId, encodedPassword, true, true, true, true, AuthorityUtils.createAuthorityList(roles));
    this.employeeNumber = employeeNumber;
  }

  public String getLoginId() {
    return super.getUsername();
  }

  // <<< Getter >>>
  public String getEmployeeNumber() { return this.employeeNumber; }
  //---

  // ======================================================================
  //* Classe d'implémentation de UserDetailsService
  // ======================================================================
  public static class LoginPrincipalService implements org.springframework.security.core.userdetails.UserDetailsService {

    /**
     *Recherchez les informations d'identification avec l'ID de connexion spécifié.
     *Si aucune information d'identification n'est trouvée, le résultat est{@code null}est.
     */
    public LoginPrincipal findByLoginId(String loginId) {
      //* En fait, obtenez les informations d'authentification de la base de données ici
      return DB.AUTH_TABLE.get(loginId);
    }

    /** {@inheritDoc} */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      //* Pour le nom d'utilisateur, le "nom d'utilisateur" pour l'authentification de base est défini par la fonction d'authentification de Spring Security.
      //Délégué à findByLoginId
      LoginPrincipal found = this.findByLoginId(username);
      if (found == null) {
        throw new UsernameNotFoundException("username not found: " + username);
      }
      return found;
    }
  }


  // ======================================================================
  // (Pour les échantillons)Conserver les informations d'authentification utilisateur dans Map comme alternative au maître d'authentification utilisateur
  // ======================================================================
  private static class DB {
    public static final Map<String, LoginPrincipal> AUTH_TABLE = new HashMap<>();

    static {
      BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
      LoginPrincipal[] data = { //
          new LoginPrincipal("U001", "S000001", passwordEncoder.encode("pass1"), new String[] { "USER" }), //
          new LoginPrincipal("U002", "S000002", passwordEncoder.encode("pass2"), new String[] { "USER" }), //
      };
      for (LoginPrincipal d : data) {
        AUTH_TABLE.put(d.getLoginId(), d);
      }
    }
  }

}

L'authentification de base est maintenant activée. Voici un exemple qui fait référence aux informations d'authentification du contrôleur.

MyController.java


@RestController
public class MyController {

  @GetMapping
  public String index() {
    SecurityContext securityContext = SecurityContextHolder.getContext();
    LoginPrincipal loginPrincipal = (LoginPrincipal) securityContext.getAuthentication().getPrincipal();

    return "Hello " + loginPrincipal.getEmployeeNumber() + "!";
  }

}

en conclusion

Ceci est mon premier article sur Qiita. J'espère pouvoir continuer. Merci pour vos conseils et vos encouragements.

Recommended Posts

Utiliser l'authentification de base avec Spring Boot
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Utiliser Spring JDBC avec Spring Boot
Exécutez un traitement arbitraire après l'authentification de base avec Spring Boot.
À partir de Spring Boot 0. Utilisez Spring CLI
Utiliser le cache avec EhCashe 2.x avec Spring Boot
Télécharger avec Spring Boot
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Authentification de base avec Java 11 HttpClient
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
[Java] Thymeleaf Basic (Spring Boot)
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Spring Boot à partir de Docker
Spring Boot + Springfox springfox-boot-starter 3.0.0 Utilisation
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Téléchargement de fichiers avec Spring Boot (ne pas utiliser de fichier en plusieurs parties)
Mise en œuvre de la fonction d'authentification avec Spring Security ②
gRPC sur Spring Boot avec grpc-spring-boot-starter
Implémentez la fonction d'authentification avec Spring Security ③
Créez une application avec Spring Boot 2
Déploiement à chaud avec le développement Spring Boot
Liaison de base de données avec doma2 (Spring boot)
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Programmation Spring Boot avec VS Code
Jusqu'à "Hello World" avec Spring Boot
Créer une application d'enquête avec Spring Boot
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Obtenez des résultats de validation avec Spring Boot
Authentification Oauth2 avec Spring Cloud Gateway
(Intellij) Hello World avec Spring Boot
Créez une application avec Spring Boot
Google Cloud Platform avec Spring Boot 2.0.0
Utiliser DBUnit pour le test Spring Boot
Comment utiliser ModelMapper (Spring boot)
J'ai essayé GraphQL avec Spring Boot
[Java] Intégration LINE avec Spring Boot
Utilisez thymeleaf3 avec le parent sans spécifier spring-boot-starter-parent dans Spring Boot
J'ai essayé Flyway avec Spring Boot
Certification / autorisation avec Spring Security & Thymeleaf
La coopération des messages a commencé avec Spring Boot
Traitement lors du démarrage d'une application avec Spring Boot
Introduction de l'authentification de base à Heroku [Spring Framework]
Hello World avec Eclipse + Spring Boot + Maven