Vejledning til AuthenticationManagerResolver i Spring Security

1. Introduktion

I denne vejledning introducerer vi AuthenticationManagerResolver og vis derefter, hvordan du bruger det til Basic- og OAuth2-godkendelsesstrømme.

2. Hvad er AuthenticationManager?

Kort sagt, den AuthenticationManager er den vigtigste strategi interface til godkendelse.

Hvis hovedperson for inputgodkendelse er gyldig og verificeret, AuthenticationManager # authenticate returnerer en Godkendelse eksempel med godkendt flag indstillet til rigtigt. Ellers, hvis hovedstolen ikke er gyldig, kaster den en AuthenticationException. I det sidste tilfælde vender det tilbage nul hvis det ikke kan afgøre.

ProviderManager er standardimplementeringen af AuthenticationManager. Det delegerer godkendelsesprocessen til en liste over AuthenticationProvider tilfælde.

Vi kan oprette global eller lokal AuthenticationManager hvis vi forlænger WebSecurityConfigurerAdapter. For en lokal AuthenticationManager, kunne vi tilsidesætte konfigurer (AuthenticationManagerBuilder).

AuthenticationManagerBuilder er en hjælperklasse, der letter opsætningen af UserDetailService, AuthenticationProviderog andre afhængigheder for at opbygge en AuthenticationManager.

For en global AuthenticationManager, skal vi definere en AuthenticationManager som en bønne.

3. Hvorfor AuthenticationManagerResolver?

AuthenticationManagerResolver lader Spring vælge en AuthenticationManager pr. kontekst. Det er en ny funktion tilføjet Spring Security i version 5.2.0:

offentlig grænseflade AuthenticationManagerResolver {AuthenticationManager resolve (C context); }

AuthenticationManagerResolver # løsning kan returnere en forekomst af AuthenticationManager baseret på en generisk kontekst. Med andre ord kan vi indstille en klasse som kontekst, hvis vi vil løse AuthenticationManager ifølge det.

Spring Security har integreret AuthenticationManagerResolver i godkendelsesflowet med HttpServletRequest og ServerWebExchange som kontekst.

4. Brugsscenarie

Lad os se, hvordan man bruger AuthenticationManagerResolver i praksis.

Antag f.eks. Et system, der har to grupper af brugere: medarbejdere og kunder. Disse to grupper har specifik godkendelseslogik og har separate datalagre. Desuden har brugere i en af ​​disse grupper kun tilladelse til at ringe til deres relaterede URL'er.

5. Hvordan fungerer det? AuthenticationManagerResolver Arbejde?

Vi kan bruge AuthenticationManagerResolver uanset hvor vi har brug for at vælge en AuthenticationManager dynamisk, men i denne vejledning er vi interesserede i at bruge det i indbyggede godkendelsesstrømme.

Lad os først oprette en AuthenticationManagerResolver, brug den derefter til grundlæggende og OAuth2-godkendelser.

5.1. Sætte op AuthenticationManagerResolver

Lad os starte med at oprette en klasse til sikkerhedskonfiguration. Vi skal udvide WebSecurityConfigurerAdapter:

@Configuration offentlig klasse CustomWebSecurityConfigurer udvider WebSecurityConfigurerAdapter {// ...}

Lad os derefter tilføje en metode, der returnerer AuthenticationManager til kunder:

AuthenticationManager-kunderAuthenticationManager () {return authentication -> {if (isCustomer (authentication)) {return new UsernamePasswordAuthenticationToken (/ * credentials * /); } smid nyt brugernavnNotFoundException (/ * hovednavn * /); }; }

Det AuthenticationManager for medarbejdere er det logisk set det samme, kun vi erstatter isKunde med er medarbejder:

offentlige AuthenticationManager-medarbejdereAuthenticationManager () {return authentication -> {if (isEmployee (authentication)) {return new UsernamePasswordAuthenticationToken (/ * credentials * /); } smid nyt brugernavnNotFoundException (/ * hovednavn * /); }; }

Lad os endelig tilføje en AuthenticationManagerResolver der løses i henhold til webadressen til anmodningen:

AuthenticationManagerResolver resolver () {return anmodning -> {if (request.getPathInfo (). StartsWith ("/ medarbejder")) {return medarbejdereAuthenticationManager (); } returnere kunderAuthenticationManager (); }; }

5.2. Til grundlæggende godkendelse

Vi kan bruge AuthenticationFilter for dynamisk at løse AuthenticationManager pr. anmodning. AuthenticationFilter blev føjet til Spring Security i version 5.2.

Hvis vi tilføjer det til vores sikkerhedsfilterkæde, kontrollerer det for hver matchet anmodning først, om det kan udtrække ethvert godkendelsesobjekt eller ej. Hvis ja, så spørger den AuthenticationManagerResolver for en passende AuthenticationManager og fortsætter strømmen.

Lad os først tilføje en metode i vores CustomWebSecurityConfigurer at oprette en AuthenticationFilter:

private AuthenticationFilter authenticationFilter () {AuthenticationFilter filter = new AuthenticationFilter (resolver (), authenticationConverter ()); filter.setSuccessHandler ((anmodning, svar, godkendelse) -> {}); returfilter; }

Årsagen til at indstille AuthenticationFilter # successHandler med et no-op Succeshåndterer er at forhindre standardadfærd for omdirigering efter vellykket godkendelse.

Derefter kan vi tilføje dette filter til vores sikkerhedsfilterkæde ved at tilsidesætte WebSecurityConfigurerAdapter # configure (HttpSecurity) i vores CustomWebSecurityConfigurer:

@ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http.addFilterBefore (authenticationFilter (), BasicAuthenticationFilter.class); }

5.3. Til OAuth2-godkendelse

BearerTokenAuthenticationFilter er ansvarlig for OAuth2-godkendelse. Det BearerTokenAuthenticationFilter # doFilterInternal metode kontrollerer for en BearerTokenAuthenticationToken i anmodningen, og hvis den er tilgængelig, løser den det relevante AuthenticationManager for at godkende tokenet.

OAuth2ResourceServerConfigurer bruges til at konfigurere BearerTokenAuthenticationFilter.

Så vi kan oprette AuthenticationManagerResolver for vores ressource server i vores CustomWebSecurityConfigurer ved at tilsidesætte WebSecurityConfigurerAdapter # configure (HttpSecurity):

@ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http .oauth2ResourceServer () .authenticationManagerResolver (resolver ()); }

6. Løs AuthenticationManager i reaktive applikationer

For en reaktiv webapplikation kan vi stadig drage fordel af konceptet med at løse AuthenticationManager i henhold til sammenhængen. Men her har vi det ReaktivAuthenticationManagerResolver i stedet:

@FunctionalInterface offentlig grænseflade ReactiveAuthenticationManagerResolver {Mono resolution (C context); }

Det returnerer en Mono af ReactiveAuthenticationManager. ReactiveAuthenticationManager er den reaktive ækvivalent med AuthenticationManager, dermed dens godkende metoden vender tilbage Mono.

6.1. Sætte op ReaktivAuthenticationManagerResolver

Lad os starte med at oprette en klasse til sikkerhedskonfiguration:

@EnableWebFluxSecurity @EnableReactiveMethodSecurity offentlig klasse CustomWebSecurityConfig {// ...}

Lad os derefter definere ReactiveAuthenticationManager til kunder i denne klasse:

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

Og derefter definerer vi det ReactiveAuthenticationManager for medarbejdere:

public ReactiveAuthenticationManager workersAuthenticationManager () {return authentication -> medarbejder (authentication) .switchIfEmpty (Mono.error (new UsernameNotFoundException (/ * principal name * /))) .map (b -> new UsernamePasswordAuthenticationToken (/ * credentials * /) }

Endelig oprettede vi en ReaktivAuthenticationManagerResolver baseret på vores scenario:

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

6.2. Til grundlæggende godkendelse

I en reaktiv webapplikation kan vi bruge AuthenticationWebFilter til godkendelse. Det godkender anmodningen og udfylder sikkerhedskonteksten.

AuthenticationWebFilter kontrollerer først, om anmodningen stemmer overens. Derefter, hvis der er et godkendelsesobjekt i anmodningen, får det det passende ReactiveAuthenticationManager for anmodningen fra ReaktivAuthenticationManagerResolver og fortsætter godkendelsesstrømmen.

Derfor kan vi konfigurere vores tilpassede AuthenticationWebFilter i vores sikkerhedskonfiguration:

@Bean public SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http .authorizeExchange () .pathMatchers ("/ **") .authenticated () .and () .httpBasic (). Disable () .addFilterAfter (new AuthenticationWebFilter ), SecurityWebFiltersOrder.REACTOR_CONTEXT) .build (); }

Først deaktiverer vi ServerHttpSecurity # httpBasic for at forhindre den normale godkendelsesstrøm, udskift den derefter manuelt med en AuthenticationWebFilter, videresender vores brugerdefinerede resolver.

6.3. Til OAuth2-godkendelse

Vi kan konfigurere ReaktivAuthenticationManagerResolver med ServerHttpSecurity # oauth2ResourceServer. ServerHttpSecurity # build tilføjer en forekomst af AuthenticationWebFilter med vores resolver til kæden af ​​sikkerhedsfiltre.

Så lad os indstille vores AuthenticationManagerResolver til OAuth2-godkendelsesfilter i vores sikkerhedskonfiguration:

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

7. Konklusion

I denne artikel har vi brugt AuthenticationManagerResolver til grundlæggende og OAuth2-godkendelser inden for et simpelt scenario.

Og vi har også undersøgt brugen af ReaktivAuthenticationManagerResolver i reaktive forårswebapplikationer til både Basic- og OAuth2-godkendelser.

Som altid er kildekoden tilgængelig på GitHub. Vores reaktive eksempel er også tilgængeligt på GitHub.


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