Registrierung bei Spring Security - Passwortverschlüsselung

Registrierung mit Spring Security - Passwortverschlüsselung

1. Überblick

Dieser Artikel beschreibt einen kritischen Teil des Registrierungsprozesses -password encoding -, bei dem das Kennwort im Klartext nicht gespeichert wird.

Es gibt einige Codierungsmechanismen, die von Spring Security unterstützt werden - und für den Artikelwe’ll use BCrypt, da dies normalerweise die beste verfügbare Lösung ist.

Die meisten anderen Mechanismen, wie z. B.MD5PasswordEncoder undShaPasswordEncoder, verwenden schwächere Algorithmen und sind jetzt veraltet.

Weitere Lektüre:

Neue Passwortspeicherung im Frühjahr Sicherheit 5

Eine Kurzanleitung zum Verständnis der Kennwortverschlüsselung in Spring Security 5 und zum Migrieren zu besseren Verschlüsselungsalgorithmen.

Read more

Authentifizierung von akzeptierten Standorten nur mit Spring Security zulassen

Erfahren Sie, wie Sie Benutzern erlauben, sich nur mit Spring Security von akzeptierten Standorten aus zu authentifizieren.

Read more

Spring Security - Benutzer mit automatischer Anmeldung nach Registrierung

Erfahren Sie, wie Sie einen Benutzer nach Abschluss des Registrierungsvorgangs schnell automatisch authentifizieren.

Read more

2. Definieren Sie den Passwort-Encoder

Zunächst definieren wir den einfachen BCryptPasswordEncoder als Bean in unserer Konfiguration:

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

Bei älteren Implementierungen - wieSHAPasswordEncoder - muss der Client beim Codieren des Kennworts einen Salt-Wert übergeben.

BCrypt jedoch stattdessenwill internally generate a random salt. Dies ist wichtig zu verstehen, da dies bedeutet, dass jeder Anruf ein anderes Ergebnis hat und wir das Passwort nur einmal verschlüsseln müssen.

Beachten Sie auch, dass der AlgorithmusBCrypteinen String mit der Länge 60 generiert. Daher müssen wir sicherstellen, dass das Kennwort in einer Spalte gespeichert wird, die es aufnehmen kann. Ein häufiger Fehler besteht darin, eine Spalte mit einer anderen Länge zu erstellen und dann zur Authentifizierungszeit einenInvalid Username or Password-Fehler zu erhalten.

3. Codieren Sie das Passwort bei der Registrierung

Wir werden jetzt diePasswordEncoder in unserenUserService verwenden, um das Passwort während des Benutzerregistrierungsprozesses zu hashen:

Beispiel 3.1. - DieUserService Hashes das Passwort

@Autowired
private PasswordEncoder passwordEncoder;

@Override
public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException {
    if (emailExist(accountDto.getEmail())) {
        throw new EmailExistsException(
          "There is an account with that email adress:" + accountDto.getEmail());
    }
    User user = new User();
    user.setFirstName(accountDto.getFirstName());
    user.setLastName(accountDto.getLastName());

    user.setPassword(passwordEncoder.encode(accountDto.getPassword()));

    user.setEmail(accountDto.getEmail());
    user.setRole(new Role(Integer.valueOf(1), user));
    return repository.save(user);
}

4. Codieren Sie das Passwort bei der Authentifizierung

Lassen Sie uns nun die andere Hälfte dieses Vorgangs abwickeln und das Kennwort verschlüsseln, wenn sich der Benutzer authentifiziert.

Zuerst müssen wir die zuvor definierte Passwort-Encoder-Bean in unseren Authentifizierungsanbieter einfügen:

@Autowired
private UserDetailsService userDetailsService;

@Bean
public DaoAuthenticationProvider authProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(encoder());
    return authProvider;
}

Die Sicherheitskonfiguration ist einfach:

  • Wir führen die Implementierung des Benutzerdetailservice ein

  • Wir definieren einen Authentifizierungsanbieter, der auf unseren Detailservice verweist

  • Wir aktivieren auch den Passwort-Encoder

Und schließlich müssen wirreference this auth provider in unserer Sicherheits-XML-Konfiguration angeben:


    

Oder falls Sie eine Java-Konfiguration verwenden:

@Configuration
@ComponentScan(basePackages = { "org.example.security" })
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider());
    }

    ...
}

5. Fazit

In diesem kurzen Tutorial wird die Registrierungsserie fortgesetzt, indem gezeigt wird, wie das Kennwort ordnungsgemäß in der Datenbank gespeichert wird, indem die einfache, aber sehr leistungsstarke BCrypt-Implementierung genutzt wird.

Diefull implementation dieses Lernprogramms zur Registrierung bei Spring Security finden Sie inthe GitHub project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.