Útmutató az AuthenticationManagerResolver programhoz a Spring Security programban
1. Bemutatkozás
Ebben az oktatóanyagban bemutatjuk AuthenticationManagerResolver majd mutassa meg, hogyan lehet használni az Basic és az OAuth2 hitelesítési folyamatokhoz.
2. Mi az AuthenticationManager?
Egyszerűen fogalmazva: AuthenticationManager a hitelesítés fő stratégiai felülete.
Ha a bemeneti hitelesítés megbízója érvényes és ellenőrzött, AuthenticationManager # hitelesítés visszatér egy Hitelesítés például a hitelesített zászló beállítása igaz. Ellenkező esetben, ha a megbízó nem érvényes, akkor dob egy AuthenticationException. Az utolsó esetben visszatér nulla ha nem tudja eldönteni.
ProviderManager az alapértelmezett megvalósítása AuthenticationManager. Átruházza a hitelesítési folyamatot egy AuthenticationProvider példányok.
Beállíthatunk globális vagy helyi AuthenticationManager ha meghosszabbítjuk WebSecurityConfigurerAdapter. Egy helyi számára AuthenticationManager, felülírhatjuk konfigurálás (AuthenticationManagerBuilder).
AuthenticationManagerBuilder egy segítő osztály, amely megkönnyíti a felállítását UserDetailService, AuthenticationProvider, és egyéb függőségek az AuthenticationManager.
Globális számára AuthenticationManager, meg kell határoznunk egy AuthenticationManager babként.
3. Miért a AuthenticationManagerResolver?
AuthenticationManagerResolver lehetővé teszi, hogy Spring kiválasszon egy AuthenticationManager kontextusonként. Ez egy új szolgáltatás, amelyet a Spring Security 5.2.0-s verziójával egészítettek ki:
nyilvános felület AuthenticationManagerResolver {AuthenticationManager feloldás (C kontextus); }
AuthenticationManagerResolver # megoldás visszaadhatja a AuthenticationManager általános összefüggés alapján. Más szóval, beállíthatunk egy osztályt kontextusként, ha meg akarjuk oldani a AuthenticationManager szerint.
A Spring Security integrálta a AuthenticationManagerResolver a hitelesítési folyamatban HttpServletRequest és ServerWebExchange mint a kontextus.
4. Használati forgatókönyv
Nézzük meg, hogyan kell használni AuthenticationManagerResolver gyakorlatban.
Tegyünk fel például egy olyan rendszert, amelynek két felhasználói csoportja van: alkalmazottak és vásárlók. Ez a két csoport sajátos hitelesítési logikával rendelkezik, és külön adattárokkal rendelkezik. Ezenfelül e csoportok bármelyikének felhasználói csak a kapcsolódó URL-eket hívhatják meg.
5. Hogyan AuthenticationManagerResolver Munka?
Tudjuk használni AuthenticationManagerResolver bárhol kell választanunk egy AuthenticationManager dinamikusan, de ebben az oktatóanyagban érdekel bennünket a beépített hitelesítési folyamatokban.
Először állítsunk fel egy AuthenticationManagerResolver, majd használja Basic és OAuth2 hitelesítéshez.
5.1. Felállítása AuthenticationManagerResolver
Kezdjük azzal, hogy létrehozunk egy osztályt a biztonsági konfigurációhoz. Ki kellene terjesztenünk WebSecurityConfigurerAdapter:
@Configuration public class CustomWebSecurityConfigurer kiterjeszti a WebSecurityConfigurerAdapter {// ...}
Ezután adjunk hozzá egy metódust, amely visszaadja a AuthenticationManager az ügyfelek számára:
AuthenticationManager customersAuthenticationManager () {return hitelesítés -> {if (isCustomer (hitelesítés)) {return new UsernamePasswordAuthenticationToken (/ * hitelesítő adatok * /); } dob új felhasználónévNotFoundException (/ * főnév * /); }; }
A AuthenticationManager az alkalmazottak számára logikusan ugyanaz, csak mi cseréljük ki isCustomer val vel isEmployee:
public AuthenticationManager alkalmazottakAuthenticationManager () {return authentication -> {if (isEmployee (authentication)) {return new UsernamePasswordAuthenticationToken (/ * hitelesítő adatok * /); } dob új felhasználónévNotFoundException (/ * főnév * /); }; }
Végül tegyünk hozzá egy AuthenticationManagerResolver amely a kérés URL-je szerint oldódik meg:
AuthenticationManagerResolver resolver () {visszatérési kérés -> {if (request.getPathInfo (). StartsWith ("/ alkalmazó")) {visszatér munkavállalókAuthenticationManager (); } visszatérő ügyfelekAuthenticationManager (); }; }
5.2. Alapvető hitelesítéshez
Tudjuk használni AuthenticationFilter dinamikusan megoldani a AuthenticationManager kérésenként. AuthenticationFilter hozzá lett adva a Spring Security 5.2-es verziójához.
Ha hozzáadjuk a biztonsági szűrő láncunkhoz, akkor minden egyező kérésnél először ellenőrzi, hogy képes-e kibontani valamilyen hitelesítési objektumot, vagy sem. Ha igen, akkor megkérdezi a AuthenticationManagerResolver alkalmasnak AuthenticationManager és folytatja az áramlást.
Először adjunk hozzá egy módszert a mi CustomWebSecurityConfigurer létrehozni egy AuthenticationFilter:
privát AuthenticationFilter authenticationFilter () {AuthenticationFilter filter = új AuthenticationFilter (resolver (), authenticationConverter ()); filter.setSuccessHandler ((kérés, válasz, hitelesítés) -> {}); visszatérő szűrő; }
A. Beállításának oka AuthenticationFilter # successHandler nem opcióval SuccessHandler megakadályozza az átirányítás alapértelmezett viselkedését a sikeres hitelesítés után.
Ezután felülírással hozzáadhatjuk ezt a szűrőt a biztonsági szűrő láncunkhoz WebSecurityConfigurerAdapter # configure (HttpSecurity) miénkben CustomWebSecurityConfigurer:
A @Orride védett void configure (HttpSecurity http) dobja a Kivételt {http.addFilterBefore (authenticationFilter (), BasicAuthenticationFilter.class); }
5.3. Az OAuth2 hitelesítéshez
BearerTokenAuthenticationFilter felelős az OAuth2 hitelesítésért. A BearerTokenAuthenticationFilter # doFilterInternal módszer ellenőrzi a BearerTokenAuthenticationToken a kérésben, és ha elérhető, akkor megoldja a megfelelőt AuthenticationManager a token hitelesítéséhez.
OAuth2ResourceServerConfigurer beállítására használatos BearerTokenAuthenticationFilter.
Tehát beállíthatjuk AuthenticationManagerResolver erőforrás-kiszolgálónk számára CustomWebSecurityConfigurer felülírással WebSecurityConfigurerAdapter # configure (HttpSecurity):
A @Orride protected void configure (HttpSecurity http) dobja a Kivételt {http .oauth2ResourceServer () .authenticationManagerResolver (resolver ()); }
6. Oldja meg AuthenticationManager a reaktív alkalmazásokban
Egy reaktív webalkalmazás számára még mindig hasznát vehetjük a megoldás megoldásának AuthenticationManager a kontextus szerint. De itt van ReactiveAuthenticationManagerResolver helyette:
@FunctionalInterface nyilvános felület ReactiveAuthenticationManagerResolver {Mono feloldás (C kontextus); }
Visszaadja a Monó nak,-nek ReactiveAuthenticationManager. ReactiveAuthenticationManager reaktív ekvivalense AuthenticationManager, ezért annak hitelesíteni metódus visszatér Monó.
6.1. Felállítása ReactiveAuthenticationManagerResolver
Kezdjük egy osztály létrehozásával a biztonsági konfigurációhoz:
@EnableWebFluxSecurity @EnableReactiveMethodSecurity nyilvános osztály CustomWebSecurityConfig {// ...}
Ezután határozzuk meg ReactiveAuthenticationManager ebbe az osztályba tartozó ügyfelek számára:
ReactiveAuthenticationManager customersAuthenticationManager () {return authentication -> customer (authentication) .switchIfEmpty (Mono.error (new UsernameNotFoundException (/ * főnév * /))) .map (b -> new UsernamePasswordAuthenticationToken (/ * hitelesítő adatok * /)); }
És ezek után meghatározzuk ReactiveAuthenticationManager az alkalmazottak számára:
public ReactiveAuthenticationManager alkalmazottakAuthenticationManager () {visszatérés hitelesítés -> alkalmazott (hitelesítés) .switchIfEmpty (Mono.error (új felhasználónévNotFoundException (/ * főnév * /))) .térkép (b -> új felhasználónévPasswordAuthenticationToken (/ * hitelesítő adatok * /)); }
Végül létrehoztunk egy ReactiveAuthenticationManagerResolver forgatókönyvünk alapján:
ReactiveAuthenticationManagerResolver resolver () {return exchange -> {if (match (exchange.getRequest (), "/ alkalmazott")) {return Mono.just (alkalmazottakAuthenticationManager ()); } return Mono.just (customersAuthenticationManager ()); }; }
6.2. Alapvető hitelesítéshez
Egy reaktív webalkalmazásban használhatjuk AuthenticationWebFilter hitelesítéshez. Hitelesíti a kérést és kitölti a biztonsági kontextust.
AuthenticationWebFilter először ellenőrzi, hogy a kérés egyezik-e. Ezt követően, ha van egy hitelesítési objektum a kérésben, akkor megkapja a megfelelőt ReactiveAuthenticationManager a kéréstől ReactiveAuthenticationManagerResolver és folytatja a hitelesítési folyamatot.
Ezért beállíthatjuk testreszabott termékeinket AuthenticationWebFilter a biztonsági konfigurációnkban:
@Bean public SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http .authorizeExchange () .pathMatchers ("/ **") .authenticated () .and () .httpBasic () .disable () .addFilterAfter (new AuthenticationW ), SecurityWebFiltersOrder.REACTOR_CONTEXT) .build (); }
Először letiltjuk ServerHttpSecurity # httpBasic a normál hitelesítési folyamat megakadályozása érdekében, majd manuálisan cserélje le egy AuthenticationWebFilter, átadva az egyedi felbontónkban.
6.3. Az OAuth2 hitelesítéshez
Beállíthatjuk a ReactiveAuthenticationManagerResolver val vel ServerHttpSecurity # oauth2ResourceServer. ServerHttpSecurity # build hozzáad egy példányát AuthenticationWebFilter megoldónkkal a biztonsági szűrők láncolatához.
Tehát állítsuk be AuthenticationManagerResolver az OAuth2 hitelesítési szűrőhöz a biztonsági konfigurációnkban:
@Bean public SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http // ... .és () .oauth2ResourceServer () .authenticationManagerResolver (resolver ()) .and () // ...; }
7. Következtetés
Ebben a cikkben használtuk AuthenticationManagerResolver egyszerű és OAuth2 hitelesítésekhez egyszerű forgatókönyvön belül.
És megvizsgáltuk a ReactiveAuthenticationManagerResolver reaktív tavaszi webalkalmazásokban az Basic és az OAuth2 hitelesítéshez egyaránt.
Mint mindig, a forráskód is elérhető a GitHubon. Reaktív példánk a GitHub-on is elérhető.