Ú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ő.