Vodič za AuthenticationManagerResolver u Spring Security

1. Uvod

U ovom uputstvu uvodimo AuthenticationManagerResolver a zatim pokazati kako se koristi za osnovne i OAuth2 tijekove provjere autentičnosti.

2. Što je AuthenticationManager?

Jednostavno rečeno, AuthenticationManager je glavno strateško sučelje za provjeru autentičnosti.

Ako je glavnica ulazne provjere valjanosti valjana i provjerena, AuthenticationManager # provjera autentičnosti vraća an Ovjera primjer s ovjeren zastava postavljena na pravi. Inače, ako glavnica nije valjana, bacit će znak AuthenticationException. Za posljednji slučaj se vraća null ako ne može odlučiti.

ProviderManager je zadana implementacija AuthenticationManager. Postupak provjere autentičnosti delegira na popis AutentificationProvider instance.

Možemo postaviti globalno ili lokalno AuthenticationManager ako produžimo WebSecurityConfigurerAdapter. Za lokalca AuthenticationManager, mogli bismo poništiti konfigurirati (AuthenticationManagerBuilder).

AuthenticationManagerBuilder je pomoćna klasa koja olakšava postavljanje UserDetailService, AutentificationProvideri druge ovisnosti za izgradnju AuthenticationManager.

Za globalnu AuthenticationManager, trebali bismo definirati AuthenticationManager kao grah.

3. Zašto AuthenticationManagerResolver?

AuthenticationManagerResolver omogućuje Spring da odabere AuthenticationManager po kontekstu. To je nova značajka dodana u Spring Security u verziji 5.2.0:

javno sučelje AuthenticationManagerResolver {AuthenticationManager rješenje (C kontekst); }

AuthenticationManagerResolver # rješavanje može vratiti primjerak AuthenticationManager na temelju generičkog konteksta. Drugim riječima, klasu možemo postaviti kao kontekst ako želimo riješiti AuthenticationManager prema njemu.

Spring Security integrirao je AuthenticationManagerResolver u tijeku provjere autentičnosti s HttpServletRequest i ServerWebExchange kao kontekst.

4. Scenarij korištenja

Pogledajmo kako koristiti AuthenticationManagerResolver u praksi.

Na primjer, pretpostavimo sustav koji ima dvije skupine korisnika: zaposlenike i kupce. Ove dvije skupine imaju specifičnu logiku provjere autentičnosti i imaju zasebne pohrane podataka. Štoviše, korisnici u bilo kojoj od ovih grupa smiju pozivati ​​samo povezane URL-ove.

5. Kako AuthenticationManagerResolver Raditi?

Možemo koristiti AuthenticationManagerResolver gdje god trebamo odabrati AuthenticationManager dinamički, ali u ovom nas vodiču zanima uporaba u ugrađenim tijekovima provjere autentičnosti.

Prvo, postavimo AuthenticationManagerResolver, a zatim ga koristite za osnovnu i OAuth2 autentifikaciju.

5.1. Postavljanje AuthenticationManagerResolver

Počnimo s izradom klase za sigurnosnu konfiguraciju. Trebali bismo produžiti WebSecurityConfigurerAdapter:

@Configuration javna klasa CustomWebSecurityConfigurer proširuje WebSecurityConfigurerAdapter {// ...}

Zatim, dodajte metodu koja vraća AuthenticationManager za kupce:

AuthenticationManager customersAuthenticationManager () {return authentication -> {if (isCustomer (authentication)) {return new UsernamePasswordAuthenticationToken (/ * vjerodajnice * /); } baci novo UsernameNotFoundException (/ * glavno ime * /); }; }

The AuthenticationManager za zaposlenike je logično isto, samo što zamjenjujemo jeKlijent s jeZaposlenik:

javni AuthenticationManager zaposleniciAuthenticationManager () {vratiti provjeru autentičnosti -> {ako (jeEeeeeeee (autentifikacija)) {vratiti novu UsernamePasswordAuthenticationToken (/ * vjerodajnice * /); } baci novo UsernameNotFoundException (/ * glavno ime * /); }; }

Na kraju, dodajmo znak AuthenticationManagerResolver koji se rješava prema URL-u zahtjeva:

Razrješivač AuthenticationManagerResolver () {zahtjev za povrat -> {ako (request.getPathInfo (). StartWith ("/ zaposlenik")) {povratak zaposlenikaAuthenticationManager (); } vratiti customersAuthenticationManager (); }; }

5.2. Za osnovnu provjeru autentičnosti

Možemo koristiti AuthenticationFilter za dinamičko rješavanje AuthenticationManager po zahtjevu. AuthenticationFilter dodan je Spring Security u verziji 5.2.

Ako ga dodamo u naš lanac sigurnosnih filtara, za svaki podudarni zahtjev prvo provjerava može li izvući bilo koji objekt za provjeru autentičnosti ili ne. Ako je odgovor da, pita se AuthenticationManagerResolver za prikladan AuthenticationManager i nastavlja tok.

Prvo, dodajmo metodu u naš CustomWebSecurityConfigurer stvoriti AuthenticationFilter:

private AuthenticationFilter authenticationFilter () {AuthenticationFilter filter = novi AuthenticationFilter (resolver (), authenticationConverter ()); filter.setSuccessHandler ((zahtjev, odgovor, autorizacija) -> {}); povratni filter; }

Razlog postavljanja AuthenticationFilter # successHandler s ne-op Rukovatelj uspjehom je spriječiti zadano ponašanje preusmjeravanja nakon uspješne provjere autentičnosti.

Zatim, taj filtar možemo dodati svom lancu sigurnosnih filtara nadjačavanjem WebSecurityConfigurerAdapter # configure (HttpSecurity) u našem CustomWebSecurityConfigurer:

@Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http.addFilterBefore (authenticationFilter (), BasicAuthenticationFilter.class); }

5.3. Za autentifikaciju OAuth2

BearerTokenAuthenticationFilter odgovoran je za OAuth2 provjeru autentičnosti. The BearerTokenAuthenticationFilter # doFilterInternal metoda provjerava a BearerTokenAuthenticationToken u zahtjevu i ako je dostupan, onda rješava odgovarajuće AuthenticationManager za autentifikaciju tokena.

OAuth2ResourceServerConfigurer koristi se za postavljanje BearerTokenAuthenticationFilter.

Dakle, možemo postaviti AuthenticationManagerResolver za naš resursni poslužitelj u našem CustomWebSecurityConfigurer nadjačavanjem WebSecurityConfigurerAdapter # configure (HttpSecurity):

@Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http .oauth2ResourceServer () .authenticationManagerResolver (resolver ()); }

6. Riješiti AuthenticationManager u reaktivnim aplikacijama

Za reaktivnu web aplikaciju još uvijek možemo imati koristi od koncepta rješavanja AuthenticationManager prema kontekstu. Ali ovdje imamo ReactiveAuthenticationManagerResolver umjesto toga:

@FunctionalInterface javno sučelje ReactiveAuthenticationManagerResolver {Mono razrješenje (C kontekst); }

Vraća a Mono od ReactiveAuthenticationManager. ReactiveAuthenticationManager je reaktivni ekvivalent AuthenticationManager, dakle njegov ovjeriti metoda se vraća Mono.

6.1. Postavljanje ReactiveAuthenticationManagerResolver

Počnimo s izradom klase za sigurnosnu konfiguraciju:

@EnableWebFluxSecurity @EnableReactiveMethodSecurity javna klasa CustomWebSecurityConfig {// ...}

Dalje, definirajmo ReactiveAuthenticationManager za kupce u ovoj klasi:

ReactiveAuthenticationManager customersAuthenticationManager () {return authentication -> customer (authentication) .switchIfEmpty (Mono.error (new UsernameNotFoundException (/ * glavno ime * /))) .map (b -> new UsernamePasswordAuthenticationToken (/) credentials; } 

A nakon toga ćemo definirati ReactiveAuthenticationManager za zaposlenike:

javna ReactiveAuthenticationManager staffAuthenticationManager () {povratak provjere autentičnosti -> zaposlenik (provjera autentičnosti) .switchIfEmpty (Mono.error (novo korisničko imeNotFoundException (/ * glavno ime * /))) .mapa (b -> novo korisničko imePasswordAuthenticationToken (/ * * }

Na kraju smo postavili a ReactiveAuthenticationManagerResolver na temelju našeg scenarija:

ReactiveAuthenticationManagerResolver resolver () {return exchange -> {if (match (exchange.getRequest (), "/ zaposlenik")) {return Mono.just (zaposleniciAuthenticationManager ()); } return Mono.just (customersAuthenticationManager ()); }; }

6.2. Za osnovnu provjeru autentičnosti

U reaktivnoj web aplikaciji možemo koristiti AutentifikacijaWebFilter za autentifikaciju. Ovjerava zahtjev i ispunjava sigurnosni kontekst.

AutentifikacijaWebFilter prvo provjerava odgovara li zahtjev. Nakon toga, ako se u zahtjevu nalazi objekt za provjeru autentičnosti, on dobiva odgovarajući ReactiveAuthenticationManager za zahtjev od ReactiveAuthenticationManagerResolver i nastavlja tijek provjere autentičnosti.

Stoga možemo postaviti svoje prilagođene AutentifikacijaWebFilter u našoj sigurnosnoj konfiguraciji:

@Bean public SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http .authorizeExchange () .pathMatchers ("/ **") .authenticated () .and () .httpBasic () .disable () .addFilterAtification (new AutitFilterAfterb (new Aut autFilterAffair (new Aut Aut. ), SecurityWebFiltersOrder.REACTOR_CONTEXT) .build (); }

Prvo onemogućimo ServerHttpSecurity # httpBasic kako bi se spriječio normalan tijek provjere autentičnosti, zatim ga ručno zamijenite s AutentifikacijaWebFilter, prosljeđujući naš prilagođeni rješivač

6.3. Za autentifikaciju OAuth2

Možemo konfigurirati ReactiveAuthenticationManagerResolver s ServerHttpSecurity # oauth2ResourceServer. ServerHttpSecurity # graditi dodaje primjerak AutentifikacijaWebFilter s našim razrješivačem na lanac sigurnosnih filtara.

Dakle, postavimo svoje AuthenticationManagerResolver za OAuth2 filtar za provjeru autentičnosti u našoj sigurnosnoj konfiguraciji:

@Bean public SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http // ... .and () .oauth2ResourceServer () .authenticationManagerResolver (resolver ()) .and () // ...; }

7. Zaključak

U ovom smo članku koristili AuthenticationManagerResolver za osnovnu i OAuth2 autentifikaciju u jednostavnom scenariju.

Također smo istražili upotrebu ReactiveAuthenticationManagerResolver u reaktivnim proljetnim web aplikacijama za osnovnu i OAuth2 autentifikaciju.

Kao i uvijek, izvorni kod dostupan je na GitHub-u. Naš reaktivni primjer dostupan je i na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found