Predvolený kódovač hesla na jarnom zabezpečení 5

1. Prehľad

V Spring Security 4 bolo možné ukladať heslá v obyčajnom texte pomocou autentifikácie v pamäti.

Veľké prepracovanie procesu správy hesiel vo verzii 5 zaviedlo bezpečnejší predvolený mechanizmus kódovania a dekódovania hesiel. To znamená, že ak vaša jarná aplikácia ukladá heslá v obyčajnom texte, upgrade na Spring Security 5 môže spôsobiť problémy.

V tomto krátkom návode popíšeme jeden z týchto potenciálnych problémov a ukážeme riešenie.

2. Jarná bezpečnosť 4

Začneme ukážkou štandardnej konfigurácie zabezpečenia, ktorá poskytuje jednoduché overenie v pamäti (platí pre jar 4):

@Configuration verejná trieda InMemoryAuthWebSecurityConfigurer rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (AuthenticationManagerBuilder auth) vyvolá výnimku {auth.inMemoryAuthentication () .withUser ("jar") .password ("tajný") .roles ("USER") } @Override protected void configure (HttpSecurity http) vyvolá výnimku {http.authorizeRequests () .antMatchers ("/ private / **") .authenticated () .antMatchers ("/ public / **") .permitAll (). A () .httpBasic (); }} 

Táto konfigurácia definuje autentifikáciu pre všetkých /súkromné/ mapované metódy a verejný prístup pre všetko pod / verejné /.

Ak použijeme rovnakú konfiguráciu v rámci Spring Security 5, zobrazí sa nasledujúca chyba:

java.lang.IllegalArgumentException: Na ID "null" nie je namapovaný žiadny PasswordEncoder.

Chyba nám hovorí, že dané heslo nebolo možné dekódovať, pretože pre našu autentifikáciu v pamäti nebol nakonfigurovaný žiadny kódovač hesiel.

3. Jarná bezpečnosť 5

Túto chybu môžeme opraviť definovaním a DelegovaniePasswordEncoder s PasswordEncoderFactories trieda.

Tento kódovač používame na konfiguráciu našich používateľov pomocou AuthenticationManagerBuilder:

@Configuration verejná trieda InMemoryAuthWebSecurityConfigurer rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (AuthenticationManagerBuilder auth) vyvolá výnimku {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder (); auth.inMemoryAuthentication () .withUser ("jar") .heslo (encoder.encode ("tajný")) .roles ("USER"); }} 

Teraz s touto konfiguráciou ukladáme naše heslo do pamäte pomocou programu BCrypt v nasledujúcom formáte:

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

Aj keď môžeme definovať našu vlastnú sadu kódovačov hesiel, odporúča sa držať sa predvolených kódovačov uvedených v PasswordEncoderFactories.

3.2. NoOpPasswordEncoder

Pokiaľ z nejakého dôvodu nechceme kódovať nakonfigurované heslo, môžeme využiť NoOpPasswordEncoder.

Za týmto účelom jednoducho predponujeme prístupovú frázu, ktorú poskytujeme heslo () metóda s {noop} identifikátor:

@Configuration verejná trieda InMemoryNoOpAuthWebSecurityConfigurer rozširuje WebSecurityConfigurerAdapter {@Override chránená neplatná konfigurácia (AuthenticationManagerBuilder auth) hodí výnimku {auth.inMemoryAuthentication () .withUser ("spring") .password ("{" noop} secret ") }} 

Takto Spring Security použije NoOpPasswordEncoder pod kapotou, keď porovnáva heslo poskytnuté používateľom s tým, ktoré sme nakonfigurovali vyššie.

Všimnite si však že by sme nikdy nemali používať tento prístup na produkčnú aplikáciu! Ako hovorí oficiálna dokumentácia, NoOpPasswordEncoder bola ukončená podpora označiť, že ide o starú implementáciu, a jej použitie sa považuje za neisté.

3.3. Migrácia existujúcich hesiel

Existujúce heslá môžeme aktualizovať na odporúčané štandardy Spring Security 5 pomocou:

  • Aktualizácia uložených hesiel v obyčajnom texte s kódovanou hodnotou:
Reťazec encoded = new BCryptPasswordEncoder (). Encode (plainTextPassword); 
  • Predpona hašovaných hesiel pomocou ich známeho identifikátora kódovača:
{bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS {sha256} 97cde38028ad898ebc02e690819fa220e88c62e0699403e94ff110fcff110f 
  • Žiadosť používateľov o aktualizáciu hesiel, keď nie je známy mechanizmus kódovania uložených hesiel

4. Záver

V tomto rýchlom príklade sme aktualizovali platnú konfiguráciu overovania pamäte Spring 4 v pamäti na jar 5 pomocou nového mechanizmu ukladania hesiel.

Ako vždy, zdrojový kód nájdete v projekte GitHub.