Zadani koder lozinke u Spring Security 5

1. Pregled

U Spring Security 4 bilo je moguće pohraniti lozinke u običnom tekstu pomoću autentifikacije u memoriji.

Velika revizija postupka upravljanja lozinkom u verziji 5 uvela je sigurniji zadani mehanizam za kodiranje i dekodiranje lozinki. To znači da ako vaša aplikacija Spring pohranjuje lozinke u običnom tekstu, nadogradnja na Spring Security 5 može stvoriti probleme.

U ovom kratkom vodiču opisat ćemo jedan od tih potencijalnih problema i pokazati rješenje.

2. Proljetna sigurnost 4

Počet ćemo s prikazom standardne sigurnosne konfiguracije koja pruža jednostavnu autentifikaciju u memoriji (vrijedi za proljeće 4):

@Configuration javna klasa InMemoryAuthWebSecurityConfigurer proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca izuzetak {auth.inMemoryAuthentication () .withUser ("spring"). "Lozinka (" tajna ")." } @Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http.authorizeRequests () .antMatchers ("/ private / **") .authenticated () .antMatchers ("/ public / **") .permitAll () .and () .httpBasic (); }} 

Ova konfiguracija definira provjeru autentičnosti za sve /privatni/ mapirane metode i javni pristup za sve pod /javnost/.

Ako koristimo istu konfiguraciju pod Spring Security 5, dobit ćemo sljedeću pogrešku:

java.lang.IllegalArgumentException: Ne postoji mapirani PasswordEncoder za id "null"

Pogreška nam govori da je dana lozinka nije moguće dekodirati jer nije konfiguriran niti jedan koder lozinke za našu autentifikaciju u memoriji.

3. Proljetna sigurnost 5

Ovu pogrešku možemo ispraviti definiranjem a DelegiranjePasswordEncoder s PasswordEncoderFactories razred.

Koristimo ovaj koder za konfiguriranje našeg korisnika s AuthenticationManagerBuilder:

Javna klasa @Configuration InMemoryAuthWebSecurityConfigurer proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca iznimku {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingerPassword; auth.inMemoryAuthentication () .withUser ("spring") .password (encoder.encode ("secret")) .roles ("USER"); }} 

Sada, s ovom konfiguracijom, pohranjujemo svoju lozinku u memoriji koristeći BCrypt u sljedećem formatu:

{bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS 

Iako možemo definirati vlastiti set kodera zaporki, preporučljivo je pridržavati se zadanih kodera PasswordEncoderFactories.

3.2. NoOpPasswordEncoder

Ako iz bilo kojeg razloga ne želimo kodirati konfiguriranu lozinku, možemo koristiti NoOpPasswordEncoder.

Da bismo to učinili, jednostavno dodajemo lozinku koju dodamo u zaporka() metoda s {noop} identifikator:

@Configuration javna klasa InMemoryNoOpAuthWebSecurityConfigurer proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca izuzetak {auth.inMemoryAuthentication (). (With "spring") nopass ("spring") nopass). }} 

Na ovaj će način Spring Security koristiti NoOpPasswordEncoder ispod poklopca kada uspoređuje lozinku koju je pružio korisnik s onom koju smo gore konfigurirali.

Imajte na umu, međutim, da nikada ne bismo trebali koristiti ovaj pristup u proizvodnoj aplikaciji! Kao što kaže službena dokumentacija, NoOpPasswordEncoder je zastarjelo naznačiti da je to naslijeđena implementacija, a njezino se korištenje smatra nesigurnim.

3.3. Migracija postojećih lozinki

Postojeće lozinke možemo ažurirati na preporučene standarde Spring Security 5 na sljedeći način:

  • Ažuriranje lozinki spremljenih u običnom tekstu s kodiranom vrijednošću:
Niz kodiran = novi BCryptPasswordEncoder (). Encode (plainTextPassword); 
  • Prefiks heširanih pohranjenih lozinki s njihovim poznatim identifikatorom kodera:
{Bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS {SHA256} 97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0 
  • Traženje od korisnika da ažuriraju svoje lozinke kada je mehanizam kodiranja za pohranjene lozinke nepoznat

4. Zaključak

U ovom smo brzom primjeru ažurirali važeću konfiguraciju provjere autentičnosti Spring 4 u memoriji na Spring 5 pomoću novog mehanizma za pohranu lozinke.

Kao i uvijek, izvorni kod možete pronaći na projektu GitHub.


$config[zx-auto] not found$config[zx-overlay] not found