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.