Sprievodca po AuthenticationManagerResolver v Spring Security

1. Úvod

V tomto návode vám predstavíme AuthenticationManagerResolver a potom ukážte, ako ho použiť na toky autentifikácie Basic a OAuth2.

2. Čo je to AuthenticationManager?

Jednoducho povedané AuthenticationManager je hlavné strategické rozhranie pre autentifikáciu.

Ak je principál vstupnej autentifikácie platný a overený, AuthenticationManager # overiť vracia Overenie napríklad s overené vlajka nastavená na pravda. V opačnom prípade, ak príkazca nie je platný, hodí znak AuthenticationException. Pre posledný prípad sa vráti nulový ak sa nevie rozhodnúť.

ProviderManager je predvolená implementácia AuthenticationManager. Deleguje proces autentifikácie na zoznam AuthenticationProvider inštancie.

Môžeme nastaviť globálne alebo lokálne AuthenticationManager ak predĺžime WebSecurityConfigurerAdapter. Pre miestneho AuthenticationManager, mohli by sme prepísať nakonfigurovať (AuthenticationManagerBuilder).

AuthenticationManagerBuilder je trieda pomocníka, ktorá uľahčuje nastavenie UserDetailService, AuthenticationProvidera ďalšie závislosti na zostavení AuthenticationManager.

Pre globálne AuthenticationManager, mali by sme definovať AuthenticationManager ako fazuľa.

3. Prečo AuthenticationManagerResolver?

AuthenticationManagerResolver nechá Spring zvoliť AuthenticationManager podľa kontextu. Je to nová funkcia pridaná do Spring Security vo verzii 5.2.0:

verejné rozhranie AuthenticationManagerResolver {AuthenticationManager vyriešiť (kontext C); }

AuthenticationManagerResolver # vyriešiť môže vrátiť inštanciu z AuthenticationManager založené na všeobecnom kontexte. Inými slovami, môžeme nastaviť triedu ako kontext, ak chceme vyriešiť AuthenticationManager podľa toho.

Jarná bezpečnosť integrovala AuthenticationManagerResolver v procese autentifikácie s HttpServletRequest a ServerWebExchange ako kontext.

4. Scenár použitia

Pozrime sa, ako sa používa AuthenticationManagerResolver v praxi.

Napríklad predpokladajme systém, ktorý má dve skupiny používateľov: zamestnancov a zákazníkov. Tieto dve skupiny majú špecifickú autentifikačnú logiku a majú samostatné úložiská údajov. Používatelia v ktorejkoľvek z týchto skupín môžu navyše volať iba na svoje súvisiace adresy URL.

5. Ako sa robí AuthenticationManagerResolver Práca?

Môžeme použiť AuthenticationManagerResolver kdekoľvek si potrebujeme zvoliť AuthenticationManager dynamicky, ale v tomto tutoriáli nás zaujíma použitie v integrovaných tokoch autentifikácie.

Najprv si založme AuthenticationManagerResolver, potom ho použite na základné overenie a overenie OAuth2.

5.1. Nastavenie AuthenticationManagerResolver

Začnime vytvorením triedy pre konfiguráciu zabezpečenia. Mali by sme predĺžiť WebSecurityConfigurerAdapter:

@Configuration verejná trieda CustomWebSecurityConfigurer rozširuje WebSecurityConfigurerAdapter {// ...}

Potom pridajme metódu, ktorá vráti AuthenticationManager pre zákazníkov:

AuthenticationManager customersAuthenticationManager () {vrátiť autentizáciu -> {if (isCustomer (autentifikácia)) {vrátiť nové UsernamePasswordAuthenticationToken (/ * poverenia * /); } hodiť novú UsernameNotFoundException (/ * hlavné meno * /); }; }

The AuthenticationManager pre zamestnancov je logicky to isté, iba my vymieňame isCustomer s je zamestnanec:

public AuthenticationManager zamestnanciAuthenticationManager () {vrátiť autentizáciu -> {if (isEmployee (autentifikácia)) {vrátiť nové UsernamePasswordAuthenticationToken (/ * poverenia * /); } hodiť novú UsernameNotFoundException (/ * hlavné meno * /); }; }

Na záver pridajme AuthenticationManagerResolver ktorý sa rieši podľa adresy URL požiadavky:

AuthenticationManagerResolver resolver () {požiadavka na vrátenie -> {if (request.getPathInfo (). StartsWith ("/ employee")) {return zamestnanciAuthenticationManager (); } vrátiť customersAuthenticationManager (); }; }

5.2. Pre základné overenie

Môžeme použiť AuthenticationFilter dynamicky vyriešiť AuthenticationManager na požiadanie. AuthenticationFilter bol pridaný do Spring Security vo verzii 5.2.

Ak ho pridáme do nášho reťazca bezpečnostných filtrov, potom pri každej zhodnej požiadavke najskôr skontroluje, či dokáže extrahovať akýkoľvek autentifikačný objekt alebo nie. Ak áno, potom sa pýta AuthenticationManagerResolver za vhodný AuthenticationManager a pokračuje v toku.

Najskôr pridajme metódu do nášho CustomWebSecurityConfigurer vytvoriť AuthenticationFilter:

private AuthenticationFilter authenticationFilter () {AuthenticationFilter filter = nový AuthenticationFilter (resolver (), authenticationConverter ()); filter.setSuccessHandler ((požiadavka, odpoveď, autorizácia) -> {}); spätný filter; }

Dôvod stanovenia AuthenticationFilter # successHandler so zákazom op SuccessHandler je zabrániť predvolenému správaniu presmerovania po úspešnej autentifikácii.

Potom môžeme tento filter pridať do nášho reťazca bezpečnostných filtrov prepísaním WebSecurityConfigurerAdapter # configure (HttpSecurity) v našom CustomWebSecurityConfigurer:

@Override protected void configure (HttpSecurity http) hodí výnimku {http.addFilterBefore (authenticationFilter (), BasicAuthenticationFilter.class); }

5.3. Pre autentifikáciu OAuth2

BearerTokenAuthenticationFilter je zodpovedný za autentifikáciu OAuth2. The BearerTokenAuthenticationFilter # doFilterInternal kontrola metód pre a BearerTokenAuthenticationToken v žiadosti, a ak je k dispozícii, vyrieši sa príslušné AuthenticationManager na autentifikáciu tokenu.

OAuth2ResourceServerConfigurer sa používa na nastavenie BearerTokenAuthenticationFilter.

Môžeme sa teda pripraviť AuthenticationManagerResolver pre náš zdrojový server v našom CustomWebSecurityConfigurer prvoradým WebSecurityConfigurerAdapter # configure (HttpSecurity):

@Override protected void configure (HttpSecurity http) vyvolá výnimku {http .oauth2ResourceServer () .authenticationManagerResolver (resolver ()); }

6. Vyriešiť AuthenticationManager v Reaktívnych aplikáciách

V prípade reaktívnej webovej aplikácie stále môžeme ťažiť z konceptu riešenia AuthenticationManager podľa kontextu. Ale tu máme ReactiveAuthenticationManagerResolver namiesto toho:

@FunctionalInterface verejné rozhranie ReactiveAuthenticationManagerResolver {mono riešenie (kontext C); }

Vracia a Mono z ReactiveAuthenticationManager. ReactiveAuthenticationManager je reaktívny ekvivalent k AuthenticationManager, teda jeho overiť metóda sa vracia Mono.

6.1. Nastavenie ReactiveAuthenticationManagerResolver

Začnime vytvorením triedy pre konfiguráciu zabezpečenia:

@EnableWebFluxSecurity @EnableReactiveMethodSecurity verejná trieda CustomWebSecurityConfig {// ...}

Ďalej definujme ReactiveAuthenticationManager pre zákazníkov v tejto triede:

ReactiveAuthenticationManager customersAuthenticationManager () {návrat autentifikácie -> zákazník (autentifikácia) .switchIfEmpty (Mono.error (nové UsernameNotFoundException (/ * hlavné meno * /))). Mapa (b -> nové UsernamePasswordAuthenticationToken (/ * poverenia * /)); } 

A potom definujeme ReactiveAuthenticationManager pre zamestnancov:

public ReactiveAuthenticationManager zamestnanciAuthenticationManager () {návrat autentifikácie -> zamestnanec (autentifikácia) .switchIfEmpty (Mono.error (nové UsernameNotFoundException (/ * hlavné meno * /))). mapa (b -> nové UsernamePasswordAuthenticationToken (/ * poverenia * /)); }

Nakoniec sme založili a ReactiveAuthenticationManagerResolver na základe nášho scenára:

ReactiveAuthenticationManagerResolver resolver () {return exchange -> {if (match (exchange.getRequest (), "/ employee")) {return Mono.just (ZaměstnanciAuthenticationManager ()); } vrátiť Mono.just (customersAuthenticationManager ()); }; }

6.2. Pre základné overenie

V reaktívnej webovej aplikácii môžeme použiť AuthenticationWebFilter na autentifikáciu. Autentifikuje požiadavku a vyplní bezpečnostný kontext.

AuthenticationWebFilter najskôr skontroluje, či sa požiadavka zhoduje. Potom, ak je v žiadosti autentifikačný objekt, dostane vhodný ReactiveAuthenticationManager za žiadosť od ReactiveAuthenticationManagerResolver a pokračuje v procese autentifikácie.

Preto môžeme nastaviť naše prispôsobené AuthenticationWebFilter v našej konfigurácii zabezpečenia:

@Bean public SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http .authorizeExchange () .pathMatchers ("/ **") .authenticated () .and () .httpBasic () .disable () .addFilterAfter (nové overenie () ), SecurityWebFiltersOrder.REACTOR_CONTEXT) .build (); }

Najprv deaktivujeme ServerHttpSecurity # httpBasic zabrániť normálnemu toku autentifikácie, potom ho ručne nahraďte znakom AuthenticationWebFilter, odovzdávajúc náš vlastný prekladač.

6.3. Pre autentifikáciu OAuth2

Môžeme nakonfigurovať ReactiveAuthenticationManagerResolver s ServerHttpSecurity # oauth2ResourceServer. ServerHttpSecurity # zostavenie pridáva inštanciu AuthenticationWebFilter s naším rezolútorom do reťazca bezpečnostných filtrov.

Poďme si teda nastaviť AuthenticationManagerResolver pre autentifikačný filter OAuth2 v našej konfigurácii zabezpečenia:

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

7. Záver

V tomto článku sme použili AuthenticationManagerResolver pre základné autentifikácie a autentifikáciu OAuth2 v rámci jednoduchého scenára.

A tiež sme preskúmali použitie ReactiveAuthenticationManagerResolver v reaktívnych webových aplikáciách Spring pre autentifikáciu Basic aj OAuth2.

Ako vždy, zdrojový kód je k dispozícii na GitHub. Náš reaktívny príklad je k dispozícii aj na GitHub.


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