Alapértelmezett jelszó kódoló a Spring Security 5-ben

1. Áttekintés

A Spring Security 4-ben lehetőség volt a jelszavak egyszerű szövegben történő tárolására a memóriában lévő hitelesítéssel.

A jelszókezelési folyamat 5-ös verziójának jelentős átalakítása bevezetett egy biztonságosabb alapértelmezett mechanizmust a jelszavak kódolásához és dekódolásához. Ez azt jelenti, hogy ha a Spring alkalmazás egyszerű szövegben tárolja a jelszavakat, akkor a Spring Security 5-re történő frissítés problémákat okozhat.

Ebben a rövid bemutatóban leírjuk az egyik lehetséges problémát és bemutatjuk a megoldást.

2. Tavaszi biztonság 4

Először egy szabványos biztonsági konfigurációt mutatunk be, amely egyszerű memóriában történő hitelesítést biztosít (érvényes a 4. tavaszra):

@Configuration nyilvános osztály Az InMemoryAuthWebSecurityConfigurer kiterjeszti a WebSecurityConfigurerAdapter {@Orride védett void konfigurációt (AuthenticationManagerBuilder auth) a {Exc.inMemoryAuthentication () .withUser ("spring"). Jelszó ("titkos"); } A @Orride protected void configure (HttpSecurity http) dobja a {http.authorizeRequests () .antMatchers ("/ private / **") .authenticated () .antMatchers ("/ public / **") .permitAll () és kivételeket. () .httpBasic (); }} 

Ez a konfiguráció meghatározza a hitelesítést mindenki számára /magán/ feltérképezett módszerek és nyilvános hozzáférés mindenhez /nyilvános/.

Ha ugyanazt a konfigurációt használjuk a Spring Security 5 alatt, a következő hibát kapjuk:

java.lang.IllegalArgumentException: Nincs a "null" azonosítóhoz leképezett PasswordEncoder

A hiba azt jelzi, hogy a megadott jelszó nem sikerült dekódolni, mivel nem volt beállítva jelszó kódoló a memóriában lévő hitelesítéshez.

3. Tavaszi biztonság 5

Javíthatjuk ezt a hibát az a definiálásával DelegálásPasswordEncoder a ... val PasswordEncoderFactories osztály.

Ezt a kódolót használjuk a felhasználónk konfigurálásához a AuthenticationManagerBuilder:

@Configuration nyilvános osztály Az InMemoryAuthWebSecurityConfigurer kiterjeszti a WebSecurityConfigurerAdapter {@Orride védett érvénytelen konfigurációt (AuthenticationManagerBuilder auth) kivételt dob ​​{PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEn auth.inMemoryAuthentication () .withUser ("spring") .password (encoder.encode ("secret")) .roles ("USER"); }} 

Ezzel a konfigurációval tároljuk a memóriában lévő jelszavunkat a BCrypt segítségével a következő formátumban:

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

Bár meghatározhatjuk saját jelszó kódolóink ​​készletét, ajánlatos betartani az alapértelmezett kódolókat PasswordEncoderFactories.

3.2. NoOpPasswordEncoder

Ha valamilyen okból nem akarjuk kódolni a beállított jelszót, használhatjuk a NoOpPasswordEncoder.

Ehhez egyszerűen előtagozzuk a megadott jelszót a Jelszó() módszer a {noop} azonosító:

@Configuration nyilvános osztály Az InMemoryNoOpAuthWebSecurityConfigurer kiterjeszti a WebSecurityConfigurerAdapter {@Orride védett érvénytelen konfigurációját (AuthenticationManagerBuilder auth) a (z) {auth.inMemoryAuthentication () .withUser ("spring"). }} 

Így a Spring Security a NoOpPasswordEncoder a motorháztető alatt, amikor összehasonlítja a felhasználó által megadott jelszót a fentiekkel konfigurált jelszóval.

Ne feledje azonban, hogy soha ne használjuk ezt a megközelítést a gyártási alkalmazásban! Amint a hivatalos dokumentáció mondja, a NoOpPasswordEncoder már elavult jelezni, hogy ez egy régi megvalósítás, és használata bizonytalan.

3.3. Meglévő jelszavak migrálása

Frissíthetjük a meglévő jelszavakat az ajánlott Spring Security 5 szabványok szerint:

  • Az egyszerű szöveges tárolt jelszavak frissítése kódolt értékkel:
String encoded = új BCryptPasswordEncoder (). Encode (plainTextPassword); 
  • A tárolt jelszavak előtagolása az ismert kódolóazonosítóval:
{bcrypt} $ 2a $ 10 $ MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS {sha256} 97cde38028ad898ebc02e690819fa220e88c62e0699403eff6404b 
  • A felhasználók kérése a jelszavak frissítésére, ha a tárolt jelszavak kódolási mechanizmusa ismeretlen

4. Következtetés

Ebben a gyors példában frissítettünk egy érvényes Spring 4 memóriában történő hitelesítési konfigurációt az Spring 5-re az új jelszó tárolási mechanizmus segítségével.

Mint mindig, itt is megtalálhatja a forráskódot a GitHub projekten.