Više davatelja autentičnosti u proljetnoj sigurnosti

1. Pregled

U ovom brzom članku usredotočit ćemo se na korištenje više mehanizama za provjeru autentičnosti korisnika u Spring Security.

To ćemo učiniti konfiguriranjem više davatelja usluga provjere autentičnosti.

2. Pružatelji autentičnosti

An AutentificationProvider je apstrakcija za dohvaćanje korisničkih podataka iz određenog spremišta (poput baze podataka, LDAP-a, prilagođenog izvora treće strane, itd.). Dohvaćene korisničke podatke koristi za provjeru valjanosti isporučenih vjerodajnica.

Jednostavno rečeno, kada je definirano više davatelja autentifikacije, davatelji će biti upitani redoslijedom kojim su deklarirani.

Za brzu demonstraciju konfigurirat ćemo dva davatelja autentičnosti - prilagođenog davatelja autentičnosti i pružatelja autentičnosti u memoriji.

3. Ovisnosti Mavena

Najprije u našu web aplikaciju dodajte potrebne ovisnosti Spring Security:

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

I bez proljetnog pokretanja:

 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 

Najnovija verzija ovih ovisnosti može se naći na spring-security-web, spring-security-core i spring-security-config.

4. Prilagođeni davatelj autentičnosti

Stvorimo prilagođenog davatelja autentičnosti implementacijom AuthneticationProvider sučelje.

Provest ćemo ovjeriti metoda - koja pokušava provjeriti autentičnost. Ulaz Ovjera objekt sadrži vjerodajnice za korisničko ime i lozinku koje je dostavio korisnik.

The ovjeriti metoda vraća potpuno popunjen Ovjera objekt ako je provjera autentičnosti uspješna. Ako provjera autentičnosti ne uspije, izbacuje iznimku tipa AuthenticationException:

@Component javna klasa CustomAuthenticationProvider implementira AuthenticationProvider {@Override public Authentication authentication (Authentication auth) baca AuthenticationException {String username = auth.getName (); Lozinka niza = auth.getCredentials () .toString (); if ("externaluser" .equals (korisničko ime) && "pass" .equals (lozinka)) {return new UsernamePasswordAuthenticationToken (korisničko ime, lozinka, Collections.emptyList ()); } else {baciti novi BadCredentialsException ("Autentifikacija vanjskog sustava nije uspjela"); }} @Override javne logičke podrške (Class auth) {return auth.equals (UsernamePasswordAuthenticationToken.class); }}

Naravno, ovo je jednostavna implementacija u svrhu našeg primjera ovdje.

5. Konfiguriranje više davatelja autentifikacije

Dodajmo sada CustomAuthenticationProvider i pružatelj provjere autentičnosti u memoriji naše konfiguracije Spring Security.

5.1. Java konfiguracija

U našoj konfiguracijskoj klasi, kreirajmo i dodajte davatelje usluga provjere autentičnosti pomoću AuthenticationManagerBuilder.

Prvo, CustomAuthenticationProvider a zatim davatelj usluga provjere autentičnosti u memoriji pomoću inMemoryAuthentication ().

Također osiguravamo da pristup uzorku URL-a “/ api / **”Treba provjeriti autentičnost:

@EnableWebSecurity javna klasa MultipleAuthProvidersSecurityConfig proširuje WebSecurityConfigurerAdapter {@Autowired CustomAuthenticationProvider customAuthProvider; @Override javna void konfiguracija (AuthenticationManagerBuilder auth) baca iznimku {auth.authenticationProvider (customAuthProvider); auth.inMemoryAuthentication () .withUser ("memuser") .password (encoder (). encode ("pass")) .roles ("USER"); } @Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http.httpBasic () .and () .authorizeRequests () .antMatchers ("/ api / **") .authenticated (); } @Bean public PasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }}

5.2. XML konfiguracija

Ako želimo koristiti XML konfiguraciju umjesto Java konfiguracije:

6. Prijava

Dalje, izradimo jednostavnu REST krajnju točku koju osiguravaju naša dva davatelja autentičnosti.

Da biste pristupili ovoj krajnjoj točki, morate navesti važeće korisničko ime i lozinku. Naši davatelji usluga provjere valjanosti provjerit će vjerodajnice i odrediti hoće li dopustiti pristup ili ne:

@RestController javna klasa MultipleAuthController {@GetMapping ("/ api / ping") javni String getPing () {return "OK"; }}

7. Ispitivanje

Na kraju, testirajmo sada pristup našoj sigurnoj aplikaciji. Pristup će biti dopušten samo ako su dostavljene valjane vjerodajnice:

@Autowired private TestRestTemplate restTemplate; @Test javna praznina givenMemUsers_whenGetPingWithValidUser_thenOk () {ResponseEntity rezultat = makeRestCallToGetPing ("memuser", "pass"); assertThat (result.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("U redu"); } @Test javna praznina givenExternalUsers_whenGetPingWithValidUser_thenOK () {ResponseEntity rezultat = makeRestCallToGetPing ("externaluser", "pass"); assertThat (result.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("U redu"); } @Test javna praznina givenAuthProviders_whenGetPingWithNoCred_then401 () {ResponseEntity rezultat = makeRestCallToGetPing (); assertThat (result.getStatusCodeValue ()). isEqualTo (401); } @Test javna praznina givenAuthProviders_whenGetPingWithBadCred_then401 () {ResponseEntity result = makeRestCallToGetPing ("user", "bad_password"); assertThat (result.getStatusCodeValue ()). isEqualTo (401); } private ResponseEntity makeRestCallToGetPing (korisničko ime niza, lozinka niza) {return restTemplate.withBasicAuth (korisničko ime, lozinka) .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); } private ResponseEntity makeRestCallToGetPing () {return restTemplate .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); }

8. Zaključak

U ovom smo brzom vodiču vidjeli kako se u Spring Security može konfigurirati više pružatelja usluga provjere autentičnosti. Osigurali smo jednostavnu aplikaciju pomoću prilagođenog davatelja autentičnosti i davatelja autentičnosti u memoriji.

Također smo napisali testove kako bismo potvrdili da pristup našoj aplikaciji zahtijeva vjerodajnice koje može potvrditi barem jedan od naših davatelja autentičnosti.

Kao i uvijek, puni izvorni kod implementacije nalazi se na GitHub-u.


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