Default Password Encoder in Spring Security 5
1. Überblick
In Spring Security 4 war es möglich, Kennwörter mithilfe der speicherinternen Authentifizierung im Klartext zu speichern.
Eine grundlegende Überarbeitung des Kennwortverwaltungsprozesses in Version 5 hat einen sichereren Standardmechanismus für das Codieren und Decodieren von Kennwörtern eingeführt. Dies bedeutet, dass ein Upgrade auf Spring Security 5 zu Problemen führen kann, wenn Ihre Spring-Anwendung Kennwörter im Klartext speichert.
In diesem kurzen Tutorial beschreiben wir eines dieser potenziellen Probleme und zeigen eine Lösung für das Problem.
2. Federsicherung 4
Zunächst wird eine Standard-Sicherheitskonfiguration angezeigt, die eine einfache In-Memory-Authentifizierung bietet (gültig für Spring 4):
@Configuration
public class InMemoryAuthWebSecurityConfigurer
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication()
.withUser("spring")
.password("secret")
.roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/private/**")
.authenticated()
.antMatchers("/public/**")
.permitAll()
.and()
.httpBasic();
}
}
Diese Konfiguration definiert die Authentifizierung für alle zugeordneten Methoden von/private/und den öffentlichen Zugriff für alle unter/public/.
Wenn wir unter Spring Security 5 dieselbe Konfiguration verwenden, wird der folgende Fehler angezeigt:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
Der Fehler sagt uns, dass das angegebene Passwortcouldn’t be decoded since no password encoder was configured for our in-memory authentication ist.
3. Federsicherheit 5
Wir können diesen Fehler beheben, indem wirDelegatingPasswordEncoder mit der KlassePasswordEncoderFactoriesdefinieren.
Wir verwenden diesen Encoder, um unseren Benutzer mitAuthenticationManagerBuilder: zu konfigurieren
@Configuration
public class InMemoryAuthWebSecurityConfigurer
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
auth.inMemoryAuthentication()
.withUser("spring")
.password(encoder.encode("secret"))
.roles("USER");
}
}
Mit dieser Konfiguration speichern wir jetzt unser In-Memory-Passwort mit BCrypt im folgenden Format:
{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
Obwohl wir unsere eigenen Kennwortcodierer definieren können, wird empfohlen, die inPasswordEncoderFactoriesangegebenendefault encoders beizubehalten.
3.1. Bestehende Passwörter migrieren
Wir können vorhandene Kennwörter auf die empfohlenen Spring Security 5-Standards aktualisieren, indem wir:
-
Aktualisieren von im Klartext gespeicherten Passwörtern mit ihrem codierten Wert:
String encoded = new BCryptPasswordEncoder().encode(plainTextPassword);
-
Das Präfixieren von gespeicherten Passwörtern mit ihrer bekannten Encoder-ID:
{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
-
Benutzer auffordern, ihre Passwörter zu aktualisieren, wenn der Verschlüsselungsmechanismus für gespeicherte Passwörter unbekannt ist
4. Fazit
In diesem kurzen Beispiel wurde eine gültige speicherinterne Spring 4-Authentifizierungskonfiguration auf Spring 5 aktualisiert, wobei der neue Kennwortspeichermechanismus verwendet wurde.
Wie immer finden Sie den Quellcode aufGitHub project.