[JAVA] Verwenden Sie die Standardauthentifizierung mit Spring Boot

Einführung

Irgendwie habe ich es im Stil für SIer geschrieben. Die Umgebung ist auch Java 1.7.

Überblick

Die Methode der Standardauthentifizierung in Spring Boot wird anhand eines Beispielcodes erläutert. Unter der Annahme, dass die Verwendungsszene WebAPI ist, wird die Einstellung so eingestellt, dass sie die zustandslose Kommunikation unterstützt.

Voraussetzung Umgebung

Ausführung

Version
Java 1.7
Spring Boot 1.5.9.RELEASE

Abhängigkeiten

Beispielcode

Aufbau

Nehmen Sie die folgenden Einstellungen in JavaConfig vor. In den Kommentaren im Quellcode finden Sie spezifische Einstellungen.

MyConfigure.java


@Configuration
public class MyConfigure extends WebSecurityConfigurerAdapter {

  // ----------------------------------------
  //Spring Security-Einstellungen
  // ----------------------------------------

  // <<<* Beachten Sie, dass WebSecurityConfigurerAdapter über mehrere Konfigurationsüberladungsmethoden verfügt.>>>
  @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 {
    //Grundlegende Authentifizierungseinstellungen
    http.httpBasic().realmName("My sample realm");
    //Festlegen von Anforderungen, die eine Authentifizierung erfordern
    http.authorizeRequests().anyRequest().authenticated();
    //Wenn CSRF-Maßnahmen aktiviert sind, führt POST ohne Token zu einem Fehler. Deaktivieren Sie ihn daher.
    http.csrf().disable();
    //Anmeldeinformationen werden immer aus dem Autorisierungsheader abgerufen, sodass Sitzungen nicht mithilfe von Cookies verwaltet werden müssen.
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  }

  // ----------------------------------------
  //Bohnendefinition
  // ----------------------------------------

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

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

}

Authentifizierungsinformationen

Anmeldeinformationen werden als eine Klasse definiert, die UserDetails [^ fqdn-1]( LoginPrincipal) implementiert. Diese Klasse sollte unter Berücksichtigung der folgenden Punkte gestaltet werden.

Basierend auf dem oben Gesagten hat dieses Beispiel das folgende Design.

-Halten Sie die "Login ID" in * Benutzername *

Durch Definieren der Implementierungsklasse von "UserDetailsService" [^ fqdn-2] als Bean können Sie die Implementierung definieren, wenn Spring Security nach Anmeldeinformationen sucht ("LoginPrincipal.LoginPrincipalService"). Diese Klasse ist zur Vereinfachung des Codes als innere Klasse von "LoginPrincipal" definiert.

In der Klasse "LoginPrincipal.DB" wird die Dummy-Verarbeitung definiert, damit der Beispielcode alleine arbeiten kann.

LoginPrincipal.java


// ======================================================================
//* UserDetails-Implementierungsklasse
// ======================================================================
public class LoginPrincipal extends org.springframework.security.core.userdetails.User {
  // ※loginId(Anmelde-ID)Ist super.In Benutzername behalten
  private final String employeeNumber; //Mitarbeiternummer

  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; }
  //---

  // ======================================================================
  //* Implementierungsklasse von UserDetailsService
  // ======================================================================
  public static class LoginPrincipalService implements org.springframework.security.core.userdetails.UserDetailsService {

    /**
     *Suchen Sie nach Anmeldeinformationen mit der angegebenen Anmelde-ID.
     *Wenn keine Anmeldeinformationen gefunden werden, ist das Ergebnis{@code null}ist.
     */
    public LoginPrincipal findByLoginId(String loginId) {
      //* Tatsächlich erhalten Sie hier die Authentifizierungsinformationen aus der Datenbank
      return DB.AUTH_TABLE.get(loginId);
    }

    /** {@inheritDoc} */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      //* Für den Benutzernamen wird der "Benutzername" für die Basisauthentifizierung durch die Authentifizierungsfunktion von Spring Security festgelegt.
      //Delegieren Sie an findByLoginId
      LoginPrincipal found = this.findByLoginId(username);
      if (found == null) {
        throw new UsernameNotFoundException("username not found: " + username);
      }
      return found;
    }
  }


  // ======================================================================
  // (Für Proben)Halten Sie Benutzerauthentifizierungsinformationen in Map als Alternative zum Benutzerauthentifizierungsmaster
  // ======================================================================
  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);
      }
    }
  }

}

Die Standardauthentifizierung ist jetzt aktiviert. Das folgende Beispiel bezieht sich auf die Authentifizierungsinformationen vom Controller.

MyController.java


@RestController
public class MyController {

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

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

}

abschließend

Dies ist mein erster Qiita-Beitrag. Ich hoffe ich kann weitermachen. Vielen Dank für Ihre Anleitung und Ermutigung.

Recommended Posts

Verwenden Sie die Standardauthentifizierung mit Spring Boot
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Verwenden Sie Spring JDBC mit Spring Boot
Führen Sie nach der Standardauthentifizierung mit Spring Boot eine beliebige Verarbeitung aus.
Beginnend mit Spring Boot 0. Verwenden Sie Spring CLI
Verwenden Sie den Cache mit EhCashe 2.x mit Spring Boot
Mit Spring Boot herunterladen
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
Versuchen Sie die LDAP-Authentifizierung mit Spring Security (Spring Boot) + OpenLDAP
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Grundlegende Authentifizierung mit Java 11 HttpClient
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
[Java] Thymeleaf Basic (Spring Boot)
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Spring Boot beginnend mit Docker
Spring Boot + Springfox Springfox-Boot-Starter 3.0.0 Verwendung
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Datei-Upload mit Spring Boot (keine mehrteilige Datei verwenden)
Implementierte Authentifizierungsfunktion mit Spring Security ②
gRPC auf Spring Boot mit grpc-spring-boot-Starter
Implementierte Authentifizierungsfunktion mit Spring Security ③
Erstellen Sie eine App mit Spring Boot 2
Hot Deploy mit Spring Boot-Entwicklung
Datenbankverknüpfung mit doma2 (Spring Boot)
Spring Boot Tutorial Verwenden der Spring Security-Authentifizierung
Spring Boot Programmierung mit VS Code
Bis "Hallo Welt" mit Spring Boot
Erstellen Sie eine Anfrage-App mit Spring Boot
Implementierte Authentifizierungsfunktion mit Spring Security ①
Erhalten Sie Validierungsergebnisse mit Spring Boot
Oauth2-Authentifizierung mit Spring Cloud Gateway
(Intellij) Hallo Welt mit Spring Boot
Erstellen Sie eine App mit Spring Boot
Google Cloud Platform mit Spring Boot 2.0.0
Verwenden Sie DBUnit für den Spring Boot-Test
Verwendung von ModelMapper (Spring Boot)
Ich habe GraphQL mit Spring Boot ausprobiert
[Java] LINE-Integration mit Spring Boot
Verwenden Sie thymeleaf3 mit parent, ohne Spring-Boot-Starter-Parent in Spring Boot anzugeben
Ich habe Flyway mit Spring Boot ausprobiert
Zertifizierung / Autorisierung mit Spring Security & Thymeleaf
Die Nachrichtenkooperation begann mit Spring Boot
Verarbeitung beim Starten einer Anwendung mit Spring Boot
Einführung der Basisauthentifizierung in Heroku [Spring Framework]
Hallo Welt mit Eclipse + Spring Boot + Maven