Registracija s Spring Security - kodiranje lozinkom

Ovaj je članak dio serije: • Proljetni vodič za sigurnosnu registraciju

• Postupak registracije s proljetnom sigurnošću

• Registracija - Aktivirajte novi račun e-poštom

• Proljetna sigurnosna registracija - ponovno pošaljite e-poštu za potvrdu

• Registracija pomoću Spring Security - kodiranje lozinkom (trenutni članak) • API za registraciju postaje RESTful

• Proljetna sigurnost - resetirajte lozinku

• Registracija - Snaga lozinke i pravila

• Ažuriranje lozinke

1. Pregled

Ovaj članak govori o kritičnom dijelu postupka registracije - šifriranje lozinkom - u osnovi ne pohranjuje lozinku u otvoren tekst.

Postoji nekoliko mehanizama kodiranja koje podržava Spring Security - a za članak, koristit ćemo BCrypt, jer je to obično najbolje dostupno rješenje.

Većina ostalih mehanizama, poput MD5PasswordEncoder i ShaPasswordEncoder koriste slabije algoritme i sada su zastarjeli.

2. Definirajte kodiranje lozinke

Počet ćemo definiranjem jednostavnog BCryptPasswordEncoder kao graha u našoj konfiguraciji:

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

Starije implementacije - kao npr SHAPasswordEncoder - zahtijevao bi od klijenta da unese vrijednost soli prilikom kodiranja lozinke.

BCrypt, međutim, interno će generirati slučajnu sol umjesto toga. To je važno shvatiti, jer to znači da će svaki poziv imati drugačiji rezultat, pa lozinku moramo kodirati samo jednom.

Da bi ovo slučajno stvaranje soli uspjelo, BCrypt će pohraniti sol unutar same vrijednosti raspršivanja. Na primjer, u sljedećoj hash vrijednosti:

$ 2a $ 10 $ ZLhnHxdpHETcxmtEStgpI. / Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

Tri su polja odvojena s $:

  1. The "2a" predstavlja verziju algoritma BCrypt
  2. The “10” predstavlja snagu algoritma
  3. The "ZLhnHxdpHETcxmtEStgpI." dio je zapravo nasumično generirana sol. U osnovi, prva 22 znaka su sol. Preostali dio zadnjeg polja stvarna je raspršena verzija običnog teksta

Također, imajte na umu da BCrypt algoritam generira niz duljine 60, pa moramo biti sigurni da će lozinka biti pohranjena u stupac koji je može primiti. Uobičajena pogreška je stvaranje stupca različite duljine, a zatim dobivanje znaka Neispravno korisničko ime ili lozinka pogreška u vrijeme autentifikacije.

3. Šifrirajte lozinku pri registraciji

Sada ćemo koristiti PasswordEncoder u našem Korisnička usluga za hashiranje lozinke tijekom postupka registracije korisnika:

Primjer 3.1. - The UserService Hash lozinku

@Autowired privatni PasswordEncoder passwordEncoder; @Override public User registerNewUserAccount (UserDto accountDto) baca EmailExistsException {if (emailExist (accountDto.getEmail ())) {throw new EmailExistsException ("Postoji račun s tom adresom e-pošte:" + accountDto.getEmail ()); } Korisnik korisnik = novi korisnik (); user.setFirstName (accountDto.getFirstName ()); user.setLastName (accountDto.getLastName ()); user.setPassword (passwordEncoder.encode (accountDto.getPassword ())); user.setEmail (accountDto.getEmail ()); user.setRole (nova uloga (Integer.valueOf (1), korisnik)); vratiti spremište.save (korisnik); }

4. Šifrirajte lozinku na autentifikaciji

Obradimo sada drugu polovicu ovog postupka i kodirajmo lozinku kada se korisnik provjeri autentičnost.

Prvo, moramo ubrizgati grah kodera zaporke koji smo prethodno definirali našem dobavljaču autentičnosti:

@Autowired private UserDetailsService userDetailsService; @Bean public DaoAuthenticationProvider authProvider () {DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider (); authProvider.setUserDetailsService (userDetailsService); authProvider.setPasswordEncoder (encoder ()); vratiti authProvider; }

Sigurnosna konfiguracija je jednostavna:

  • ubrizgavamo našu implementaciju usluge detalja o korisnicima
  • definiramo davatelja autentičnosti koji upućuje na našu uslugu pojedinosti
  • omogućujemo i kodiranje lozinke

I na kraju, trebamo referencirajte ovog davatelja usluga autorizacije u našoj sigurnosnoj XML konfiguraciji:

Ili, u slučaju da koristite Java konfiguraciju:

@Configuration @ComponentScan (basePackages = {"com.baeldung.security"}) @EnableWebSecurity javna klasa SecSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) throwsvid Exception {AuthentroverPerv. } ...}

5. Zaključak

Ovaj brzi vodič nastavlja seriju Registracija pokazujući kako pravilno pohraniti lozinku u bazu podataka koristeći jednostavnu, ali vrlo moćnu implementaciju BCrypt.

The puna provedba ovog vodiča za registraciju u Spring Security možete pronaći na GitHub-u.

Sljedeći » API za registraciju postaje RESTful « Prethodna proljetna sigurnosna registracija - ponovno pošaljite e-poštu za potvrdu