Es ist ein Memorandum, weil ich die Authentifizierung von Spring Security untersucht habe.
SecurityFilterChain wird auf die Anforderung angewendet. Standardmäßig ist UsernamePasswordAuthenticationFilter für die Authentifizierung verantwortlich (gilt für angegebene Pfade, z. B. / login). AuthenticationManager wird vom Filter aufgerufen und entscheidet, ob eine Authentifizierung durchgeführt werden soll oder nicht. AuthenticationManager verfügt über mehrere Authentifizierungsanbieter und delegiert die Authentifizierungsberechtigungs- / Ablehnungsverarbeitung an jeden Anbieter.
AuthenticationFilter Es wird auf die URL angewendet, die den Authentifizierungsprozess ausführt. Führt eine Nullprüfung der Benutzereingaben durch, gibt basierend auf den Eingabeinformationen ein UsernamePasswordAuthenticationToken aus und delegiert die Authentifizierungsberechtigung an den Manager.
UsernamePasswordAuthenticationToken Ein Datenobjekt mit einem Eingabewert, der AbstractAuthenticationToken erbt, und einem Feldparameter, der für die Beurteilung der Authentifizierung verwendet wird. Jeder Anbieter empfängt dieses Objekt und bestimmt anhand der Feldparameter, ob es authentifiziert werden kann.
AuthenticationManager Die Schnittstelle org.springframework.security.authentication.AuthenticationManager. Für diese Schnittstelle ist nur eine Methode definiert.
AuthenticationManager.java
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
Die Standardimplementierungsklasse ist org.springframework.security.authentication.ProviderManager.
ProviderManager verfügt tatsächlich über AuthenticationProvider, der beispielsweise die Kennwortübereinstimmung als Array beurteilt und die Authentifizierungsmethode jedes Anbieters aufruft, um die Authentifizierung zu beurteilen.
AuthenticationProvider Dies ist eine Klasse, die tatsächlich eine Authentifizierungsbeurteilung vornimmt (z. B. Kennwortabgleich usw.). Wie oben erwähnt, können mehrere Anbieter registriert werden.
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider());
auth.authenticationProvider(authProvider2());
}
public AuthenticationProvider authProvider() {
return new AbstractUserDetailsAuthenticationProvider() {
@Override
protected void additionalAuthenticationChecks(UserDetails userDetails,
UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
//
}
@Override
protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication)
throws AuthenticationException {
//Der Vorgang zum Erstellen eines bestimmten Benutzers, den Sie für die Anmeldung verwenden möchten
return user;
}
};
}
Es wird möglicherweise nicht sehr oft verwendet, aber wenn Sie den Provider dazu bringen, einen Benutzer zurückzugeben, der UserDetails erbt, Dies kann auch wie eine In-Memory-Authentifizierung sein.
Um einen Anbieter zu registrieren, fügen Sie einfach eine Bean-Annotation unter der Konfigurationsklasse hinzu, die WebSecurityConfigurerAdapter erbt.
@Bean
public AuthenticationProvider authProvider() {
return new CustomAuthenticationProvider(passwordEncoder, authenticationService);
}
Die Benutzerinformationen für die Datenbank werden in der RetrieveUser-Methode des Anbieters erfasst, und die Authentifizierung wird durch Bestätigen der Übereinstimmung des Kennworts beurteilt.
Das ist einfach, aber es ist eine Zusammenfassung. In Bezug auf die interne Implementierung ist dies interessant, da es Gegenmaßnahmen gegen Timing-Angriffe gegen das Hashing von Passwörtern gibt.
In diesem Artikel finden Sie eine Zusammenfassung von Spring Security als Ganzes. Spring Security Usage Memo Basic / Mechanismus
Recommended Posts