[JAVA] So implementieren Sie den Authentifizierungsprozess durch Angabe von Benutzername und Kennwort in Spring Boot

Einführung

Während des Authentifizierungsprozesses von Spring Boot habe ich untersucht, wie das Kennwort angegeben werden kann, das ich mir schon lange gefragt habe.

Überblick

Wir zeigen Ihnen, wie Sie die Authentifizierungsverarbeitung mit einem Benutzernamen und einem Kennwort in Spring Boot und Spring Security implementieren.

Die vorausgesetzte Umgebung ist wie folgt.

Version
Java 1.7
Spring Boot 1.5.9.RELEASE

[Problem] Das Passwort kann nicht in "UserDetailsService" angegeben werden

Wenn Sie zu "Spring Boot Authentication Process" gehen, finden Sie viele Beispiele mit "loadUserByUsername" von "UserDetailsService" [^ fqcn-uds]. Ich habe auch geschrieben. → Standardauthentifizierung mit Spring Boot verwenden

Wie unten gezeigt, ist das einzige Argument für "loadUserByUsername" "username".

UserDetailsService


UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

Aus diesem Grund ist es nicht möglich, Fälle zu behandeln, in denen eine ** Authentifizierungsverarbeitung mit einem angegebenen Benutzernamen und Kennwort ** erforderlich ist. In den folgenden Fällen kann beispielsweise "loadUserByUsername" nicht verwendet werden.

--Password-Hashing wird auf der DB-Seite [^ cript] durchgeführt, und das Kennwort muss in den SQL-Parameterwert aufgenommen werden.

[^ cript]: PostgreSQL crypt Funktion usw.

[Lösung] Verwenden Sie "AbstractUserDetailsAuthenticationProvider"

Verwenden Sie AbstractUserDetailsAuthenticationProvider [^ fqcn-audap] anstelle von UserDetailsService. Insbesondere durch Erstellen einer Bean von AuthenticationProvider mit AbstractUserDetailsAuthenticationProvider können Sie den ** Authentifizierungsprozess einfach mit Benutzername und Passwort ** implementieren.

Beispielcode

Registrieren Sie den Authentifizierungsanbieter bei Java Config


@Configuration
public class MyConfigure extends WebSecurityConfigurerAdapter {
  //* Eine grundlegende Authentifizierung ist erforderlich, damit alle URLs den Betrieb überprüfen können.
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic().realmName("My sample realm"); //Grundlegende Authentifizierungseinstellungen
    http.authorizeRequests().anyRequest().authenticated(); //Festlegen von Anforderungen, die eine Authentifizierung erfordern
  }


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

  @Bean
  public AuthenticationProvider getAuthenticationProvider() {
    //Verwenden Sie Ihren eigenen AuthenticationProvider
    return new MyUserDetailsAuthenticationProvider();
  }
}

Definition Ihres eigenen Authentifizierungsanbieters


//Durch das Erben von AbstractUserDetailsAuthenticationProvider ist es in Ordnung, nur retrieveUser zu implementieren
public class MyUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
  private static final String DUMMY_PASSWORD = "DUMMY_PASSWORD"; //* Da es nicht zur Authentifizierung verwendet wird, kann ein beliebiger Wert verwendet werden.(Null und leere Zeichenfolge sind NG)
  private static final List<GrantedAuthority> AUTH_USER = AuthorityUtils.createAuthorityList("USER"); //* In diesem Beispiel haben alle diese Berechtigung.

  // <<< N/A >>>
  @Override protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {}
  //---

  @Override
  protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
    String userId = username;
    String password = (String) authentication.getCredentials();

    //Überprüfen Sie die Benutzer-ID und das Kennwort
    boolean isValid = AuthApi.isValidUserIdAndPassword(userId, password); //* Pseudocode, der sich mit der API der externen Bibliothek authentifiziert
    if (!isValid) { throw new UsernameNotFoundException(username); }

    //Implementierung von Benutzerdetails(User)Wird generiert und als Rückgabewert verwendet
    return new User(username, DUMMY_PASSWORD, AUTH_USER);
  }
}

Schließlich

Wie ich am Anfang schrieb, gibt es viele Beispiele, die "loadUserByUsername" verwenden, aber aus irgendeinem Grund schien es nur wenige Beispiele zu geben, die Passwörter für die Authentifizierungsverarbeitung verwenden, also habe ich es nachgeschlagen und geschrieben. Wenn Sie Fehler oder Verbesserungen haben, teilen Sie uns dies bitte mit.

Recommended Posts

So implementieren Sie den Authentifizierungsprozess durch Angabe von Benutzername und Kennwort in Spring Boot
Implementieren Sie die Anmeldefunktion in Rails einfach mit Name und Passwort (1)
Implementieren Sie die Anmeldefunktion in Rails einfach mit nur einem Namen und einem Passwort (2).
Aufrufen und Verwenden der API in Java (Spring Boot)
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So binden Sie mit einer Eigenschaftendatei in Spring Boot
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Booten nach Umgebung mit Spring Boot of Maven
So ändern Sie den Einstellungswert von application.properties beim Booten im Frühjahrsstart
Implementieren Sie die Anmeldefunktion in Rails einfach mit Name und Passwort (3).
So steuern Sie Transaktionen in Spring Boot ohne Verwendung von @Transactional
Ich weiß nicht, welchen Benutzernamen und welches Kennwort ich beim Starten von Tomcat für die Benutzerauthentifizierung eingeben soll.
Wie man Spring Security authentifizierte Benutzerinformationen außer Benutzer-ID und Kennwort gibt und wie man darauf verweist
Hash beim Spring-Boot das Passwort und verwenden Sie die Mitgliederregistrierung und die Spring-Sicherheit, um die Anmeldefunktion zu implementieren.
Wie man Lombok im Frühling benutzt
So stellen Sie Spring Boot + PostgreSQL ein
So legen Sie ein Profil mit annotationsbasierter Konfiguration im Spring-Framework fest und verwenden es
Implementieren Sie die REST-API mit Spring Boot
So stellen Sie sicher, dass CsrfRequestDataValueProcessor und der ursprüngliche RequestDataValueProcessor beim Spring Boot nebeneinander existieren
Implementieren Sie die Spring Boot-Anwendung in Gradle
Verwendung von ModelMapper (Spring Boot)
So benennen Sie Variablen in Java
[Ruby on Rails] So melden Sie sich nur mit Ihrem Namen und Passwort mit dem Gem-Gerät an
Anzeigen der in Spring Boot eingegebenen Zeichen im Browser und Referenzlinks [Einführung in Spring Boot / Für Anfänger]
[Spring Boot] Ich habe untersucht, wie die Nachbearbeitung der empfangenen Anforderung implementiert werden kann.
So implementieren Sie eine Diashow mit Slick in Rails (einzeln und mehrfach nacheinander)
[Spring Boot Actuator] So registrieren Sie Ihren eigenen Integritätsprüfungsprozess manuell
So aktualisieren Sie Benutzeränderungen in Rails Devise, ohne ein Kennwort einzugeben
So implementieren Sie die E-Mail-Authentifizierungsfunktion zum Zeitpunkt der Benutzerregistrierung
So implementieren Sie Suchfunktionen in Rails
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
So ändern Sie den App-Namen in Rails
Wie kann ich Spring Tool in Eclipse 4.6.3 einbinden?
So erzwingen Sie Codierungskonventionen in Java
So implementieren Sie Ranking-Funktionen in Rails
So implementieren Sie die asynchrone Verarbeitung in Outsystems
So teilen Sie eine Spring Boot-Nachrichtendatei
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
[Spring Boot] So rufen Sie Eigenschaften dynamisch aus einer in einer URL enthaltenen Zeichenfolge ab
Ruft den Klassennamen und den Methodennamen des Controllers ab, der vom HandlerInterceptor von Spring Boot ausgeführt wird
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
So verkleinern Sie das Spring Boot Docker-Image
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
So trennen Sie .scss nach Controller in Rails
So implementieren Sie eine ähnliche Funktion in Rails
So implementieren Sie optimistisches Sperren in der REST-API
So definieren Sie mehrere orm.xml in Spring4, JPA2.1
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Spring Boot - So stellen Sie das Sitzungszeitlimit ein
So implementieren Sie Paginierung in GraphQL (für Ruby)
Bis Sie ein Spring Boot-Projekt in Intellij erstellen und an Github senden
[Java] So erhalten Sie den Schlüssel und den Wert, die in Map gespeichert sind, durch iterative Verarbeitung