Több hitelesítési szolgáltató a tavaszi biztonságban

1. Áttekintés

Ebben a rövid cikkben több mechanizmus használatára fogunk összpontosítani a felhasználók hitelesítéséhez a Spring Security alkalmazásban.

Ezt több hitelesítés-szolgáltató konfigurálásával fogjuk megtenni.

2. Hitelesítés-szolgáltatók

An AuthenticationProvider egy absztrakció a felhasználói információk lekéréséhez egy adott tárból (például adatbázisból, LDAP-ból, egyedi külső forrásból stb.). A beolvasott felhasználói adatokat felhasználja a mellékelt hitelesítő adatok ellenőrzéséhez.

Egyszerűen fogalmazva, ha több hitelesítési szolgáltató van meghatározva, akkor a szolgáltatóktól a deklarált sorrendben kell lekérdezni.

A gyors bemutatás érdekében két hitelesítés-szolgáltatót konfigurálunk - egy egyedi hitelesítés-szolgáltatót és egy memóriában lévő hitelesítés-szolgáltatót.

3. Maven-függőségek

Először adjuk hozzá a szükséges tavaszi biztonsági függőségeket webalkalmazásunkhoz:

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

És tavaszi csizma nélkül:

 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 

Ezeknek a függőségeknek a legújabb verziója megtalálható a spring-security-web, spring-security-core és a spring-security-config oldalakon.

4. Egyéni hitelesítés-szolgáltató

Most hozzunk létre egy egyedi hitelesítési szolgáltatót a AuthneticationProvider felület.

Meg fogjuk valósítani a hitelesíteni módszer - amely megkísérli a hitelesítést. A bemenet Hitelesítés objektum tartalmazza a felhasználó által megadott felhasználónév és jelszó hitelesítő adatokat.

A hitelesíteni metódus egy teljesen kitöltött értéket ad vissza Hitelesítés objektumot, ha a hitelesítés sikeres. Ha a hitelesítés nem sikerül, akkor kivételt hoz a típusból AuthenticationException:

@Component public class CustomAuthenticationProvider implementates AuthenticationProvider {@Orride public Authentication authentication (Authentication auth) dobja az AuthenticationException {String felhasználónév = auth.getName (); Karakterlánc jelszó = auth.getCredentials () .toString (); if ("externaluser" .equals (felhasználónév) && "pass" .equals (jelszó)) {return new UsernamePasswordAuthenticationToken (felhasználónév, jelszó, Collections.emptyList ()); } else {dobjon új BadCredentialsException-t ("A külső rendszer hitelesítése nem sikerült"); }} @Orride nyilvános logikai támogatások (Class auth) {return auth.equals (UsernamePasswordAuthenticationToken.class); }}

Természetesen ez egy egyszerű megvalósítás az itt bemutatott példánk szempontjából.

5. Több hitelesítés-szolgáltató beállítása

Most tegyük hozzá a CustomAuthenticationProvider és a memóriában található hitelesítés-szolgáltató a tavaszi biztonsági konfigurációnkhoz.

5.1. Java konfiguráció

Konfigurációs osztályunkban most hozzuk létre és adjuk hozzá a hitelesítés-szolgáltatókat a AuthenticationManagerBuilder.

Először is a CustomAuthenticationProvider majd egy memóriában lévő hitelesítés-szolgáltatót a használatával inMemoryAuthentication ().

Arról is gondoskodunk, hogy az URL-mintához való hozzáférés/ api / **”Hitelesítést igényel:

Az @EnableWebSecurity nyilvános osztály, a MultipleAuthProvidersSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@Autowired CustomAuthenticationProvider customAuthProvider; A @Orride public void configure (AuthenticationManagerBuilder auth) dobja a Kivételt {auth.authenticationProvider (customAuthProvider); auth.inMemoryAuthentication () .withUser ("memuser"). jelszó (encoder (). encode ("pass")) .roles ("USER"); } A @Orride protected void configure (HttpSecurity http) dobja a {http.httpBasic () .and () .and () .authorizeRequests () .antMatchers ("/ api / **") .authenticated () kivételt; } @Bean public PasswordEncoder passwordEncoder () {return new BCryptPasswordEncoder (); }}

5.2. XML konfiguráció

Alternatív megoldásként, ha XML konfigurációt akarunk használni a Java konfiguráció helyett:

6. Az alkalmazás

Ezután hozzunk létre egy egyszerű REST végpontot, amelyet a két hitelesítés-szolgáltatónk biztosít.

A végpont eléréséhez érvényes felhasználónevet és jelszót kell megadni. Hitelesítési szolgáltatóink hitelesítik a hitelesítő adatokat, és meghatározzák, hogy engedélyezik-e a hozzáférést vagy sem:

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

7. Tesztelés

Végül most teszteljük a biztonságos alkalmazásunkhoz való hozzáférést. A hozzáférés csak akkor engedélyezett, ha érvényes hitelesítő adatokat ad meg:

@Autowired private TestRestTemplate restTemplate; @Test public void givenMemUsers_whenGetPingWithValidUser_thenOk () {ResponseEntity result = makeRestCallToGetPing ("memuser", "pass"); assertThat (eredmény.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("OK"); } @Test public void givenExternalUsers_whenGetPingWithValidUser_thenOK () {ResponseEntity result = makeRestCallToGetPing ("externaluser", "pass"); assertThat (eredmény.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("OK"); } @Test public void givenAuthProviders_whenGetPingWithNoCred_then401 () {ResponseEntity result = makeRestCallToGetPing (); assertThat (eredmény.getStatusCodeValue ()). isEqualTo (401); } @Test public void givenAuthProviders_whenGetPingWithBadCred_then401 () {ResponseEntity result = makeRestCallToGetPing ("user", "bad_password"); assertThat (eredmény.getStatusCodeValue ()). isEqualTo (401); } privát ResponseEntity makeRestCallToGetPing (String felhasználónév, String jelszó) {return restTemplate.withBasicAuth (felhasználónév, jelszó) .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); } privát ResponseEntity makeRestCallToGetPing () {return restTemplate .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); }

8. Következtetés

Ebben a gyors oktatóanyagban láthattuk, hogyan lehet több hitelesítési szolgáltatót konfigurálni a Spring Security alkalmazásban. Egyszerű alkalmazást biztosítottunk egyedi hitelesítés-szolgáltató és memóriában lévő hitelesítés-szolgáltató használatával.

És írtunk teszteket is annak igazolására, hogy alkalmazásunkhoz való hozzáféréshez hitelesítő adatokra van szükség, amelyeket legalább az egyik hitelesítés-szolgáltatónk érvényesíthet.

Mint mindig, a megvalósítás teljes forráskódja megtalálható a GitHubon.


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