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.