Während des Authentifizierungsprozesses von Spring Boot habe ich untersucht, wie das Kennwort angegeben werden kann, das ich mir schon lange gefragt habe.
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 |
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.
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.
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);
}
}
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