Flere autentiseringsleverandører i vårsikkerhet

1. Oversikt

I denne raske artikkelen skal vi fokusere på å bruke flere mekanismer for å autentisere brukere i Spring Security.

Vi gjør det ved å konfigurere flere autentiseringsleverandører.

2. Autentiseringsleverandører

An AuthenticationProvider er en abstraksjon for å hente brukerinformasjon fra et bestemt depot (som en database, LDAP, tilpasset tredjepartskilde, etc.). Den bruker hentet brukerinformasjon for å validere de oppgitte legitimasjonene.

Enkelt sagt, når flere autentiseringsleverandører er definert, vil leverandørene bli spurt i den rekkefølgen de er erklært.

For en rask demonstrasjon konfigurerer vi to autentiseringsleverandører - en tilpasset godkjenningsleverandør og en autentiseringsleverandør i minnet.

3. Maven-avhengigheter

La oss først legge til de nødvendige vårsikkerhetsavhengighetene i webapplikasjonen:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security 

Og uten vårstøvel:

 org.springframework.security spring-security-web 5.2.2.RELEASE org.springframework.security spring-security-core 5.2.2.RELEASE org.springframework.security spring-security-config 5.2.2.RELEASE 

Den siste versjonen av disse avhengighetene finner du på vår-sikkerhets-nett, vår-sikkerhet-kjerne og vår-sikkerhet-konfigurasjon.

4. Tilpasset autentiseringsleverandør

La oss nå opprette en tilpasset autentiseringsleverandør ved å implementere AuthneticationProvider grensesnitt.

Vi skal implementere autentisere metode - som prøver autentisering. Inndata Godkjenning objektet inneholder brukernavn og passordlegitimasjon gitt av brukeren.

De autentisere metoden returnerer en fullbefolket Godkjenning objekt hvis godkjenningen er vellykket. Hvis autentisering mislykkes, kaster den et unntak av typen AuthenticationException:

@Komponent offentlig klasse CustomAuthenticationProvider implementerer AuthenticationProvider {@Override public Authentication authenticate (Authentication auth) kaster AuthenticationException {String username = auth.getName (); Strengpassord = auth.getCredentials () .toString (); if ("externaluser" .equals (brukernavn) && "pass" .equals (passord)) {returner nytt brukernavnPasswordAuthenticationToken (brukernavn, passord, Collections.emptyList ()); } annet {kast ny BadCredentialsException ("Ekstern systemautentisering mislyktes"); }} @Override offentlige boolske støtter (Class auth) {return auth.equals (UsernamePasswordAuthenticationToken.class); }}

Naturligvis er dette en enkel implementering for formålet med eksemplet vårt her.

5. Konfigurere flere autentiseringsleverandører

La oss nå legge til CustomAuthenticationProvider og en autentiseringsleverandør i minnet til vår Spring Security-konfigurasjon.

5.1. Java-konfigurasjon

I vår konfigurasjonsklasse, la oss nå opprette og legge til autentiseringsleverandører ved hjelp av AuthenticationManagerBuilder.

Først, den CustomAuthenticationProvider og deretter en autentiseringsleverandør i minnet ved hjelp av inMemoryAuthentication ().

Vi sørger også for at tilgang til URL-mønsteret “/ api / **”Må godkjennes:

@EnableWebSecurity offentlig klasse MultipleAuthProvidersSecurityConfig utvider WebSecurityConfigurerAdapter {@Autowired CustomAuthenticationProvider customAuthProvider; @ Override public void configure (AuthenticationManagerBuilder auth) kaster Unntak {auth.authenticationProvider (customAuthProvider); auth.inMemoryAuthentication () .withUser ("memuser") .password (encoder (). encode ("pass")) .roles ("USER"); } @ Override-beskyttet tomkonfigurasjon (HttpSecurity http) kaster unntak {http.httpBasic () .and () .authorizeRequests () .antMatchers ("/ api / **"). Godkjent (); } @Bean public PasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }}

5.2. XML-konfigurasjon

Alternativt, hvis vi vil bruke XML-konfigurasjon i stedet for Java-konfigurasjon:

6. Søknaden

La oss deretter lage et enkelt REST-sluttpunkt som er sikret av våre to autentiseringsleverandører.

For å få tilgang til dette endepunktet, må et gyldig brukernavn og passord oppgis. Våre autentiseringsleverandører vil validere legitimasjonen og avgjøre om de skal tillate tilgang eller ikke:

@RestController public class MultipleAuthController {@GetMapping ("/ api / ping") public String getPing () {return "OK"; }}

7. Testing

Til slutt, la oss nå teste tilgangen til den sikre applikasjonen vår. Tilgang er bare tillatt hvis gyldig legitimasjon er oppgitt:

@Autowired privat TestRestTemplate restTemplate; @Test offentlig ugyldig givenMemUsers_whenGetPingWithValidUser_thenOk () {ResponseEntity result = makeRestCallToGetPing ("memuser", "pass"); assertThat (result.getStatusCodeValue ()). er EqualTo (200); assertThat (result.getBody ()). isEqualTo ("OK"); } @Test offentlig ugyldig gittExternalUsers_whenGetPingWithValidUser_thenOK () {ResponseEntity result = makeRestCallToGetPing ("externaluser", "pass"); assertThat (result.getStatusCodeValue ()). er EqualTo (200); assertThat (result.getBody ()). erEqualTo ("OK"); } @Test offentlig ugyldig givenAuthProviders_whenGetPingWithNoCred_then401 () {ResponseEntity result = makeRestCallToGetPing (); assertThat (result.getStatusCodeValue ()). isEqualTo (401); } @Test offentlig ugyldig givenAuthProviders_whenGetPingWithBadCred_then401 () {ResponseEntity result = makeRestCallToGetPing ("user", "bad_password"); assertThat (result.getStatusCodeValue ()). erEqualTo (401); } privat ResponseEntity makeRestCallToGetPing (String brukernavn, String passord) {return restTemplate.withBasicAuth (brukernavn, passord) .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); } private ResponseEntity makeRestCallToGetPing () {return restTemplate .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); }

8. Konklusjon

I denne raske opplæringen har vi sett hvordan flere autentiseringsleverandører kan konfigureres i Spring Security. Vi har sikret et enkelt program ved hjelp av en tilpasset autentiseringsleverandør og en autentiseringsleverandør i minnet.

Og vi har også skrevet tester for å verifisere at tilgangen til applikasjonen vår krever legitimasjon som kan valideres av minst en av autentiseringsleverandørene våre.

Som alltid kan hele kildekoden for implementeringen bli funnet på GitHub.


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