Viacerí poskytovatelia autentifikácie v jarnej bezpečnosti

1. Prehľad

V tomto rýchlom článku sa zameriame na použitie viacerých mechanizmov na autentifikáciu používateľov v Spring Security.

Urobíme to konfiguráciou viacerých poskytovateľov autentifikácie.

2. Poskytovatelia autentifikácie

An AuthenticationProvider je abstrakcia na načítanie informácií o používateľovi z konkrétneho úložiska (napríklad z databázy, LDAP, vlastného zdroja tretej strany atď.). Využíva načítané informácie o používateľovi na overenie dodaných poverení.

Jednoducho povedané, keď je definovaných viac poskytovateľov autentifikácie, bude sa na poskytovateľov dopytovať v poradí, v akom sú deklarovaní.

Pre rýchlu ukážku nakonfigurujeme dvoch poskytovateľov autentifikácie - vlastného poskytovateľa autentifikácie a poskytovateľa autentifikácie v pamäti.

3. Závislosti Maven

Najprv do našej webovej aplikácie pridáme potrebné závislosti Spring Security:

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

A bez Spring Boot:

 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 

Najnovšiu verziu týchto závislostí nájdete na stránkach spring-security-web, spring-security-core a spring-security-config.

4. Vlastný poskytovateľ autentifikácie

Vytvorme teraz vlastného poskytovateľa autentifikácie implementáciou AuthneticationProvider rozhranie.

Ideme implementovať overiť metóda - ktorá sa pokúša o autentifikáciu. Vstup Overenie objekt obsahuje prihlasovacie meno a heslo poskytnuté používateľom.

The overiť metóda vráti plne osídlené Overenie objekt, ak je autentifikácia úspešná. Ak autentifikácia zlyhá, vyvolá výnimku typu AuthenticationException:

@ Verejná trieda komponentu CustomAuthenticationProvider implementuje AuthenticationProvider {@Override public Authentication authenticate (Authentication auth) hodí AuthenticationException {String username = auth.getName (); Reťazcové heslo = auth.getCredentials () .toString (); if ("externaluser" .equals (username) && "pass" .equals (password)) {return new UsernamePasswordAuthenticationToken (username, password, Collections.emptyList ()); } else {hodiť novú BadCredentialsException ("Overenie externého systému zlyhalo"); }} @Override public boolean podporuje (Class auth) {return auth.equals (UsernamePasswordAuthenticationToken.class); }}

Pre účely nášho príkladu je to samozrejme jednoduchá implementácia.

5. Konfigurácia viacerých poskytovateľov autentifikácie

Teraz pridajme CustomAuthenticationProvider a poskytovateľa autentifikácie v pamäti do našej konfigurácie Spring Security.

5.1. Konfigurácia Java

V našej konfiguračnej triede poďme teraz vytvoriť a pridať poskytovateľov autentifikácie pomocou AuthenticationManagerBuilder.

Po prvé, CustomAuthenticationProvider a potom poskytovateľ autentifikácie v pamäti pomocou inMemoryAuthentication ().

Zaisťujeme tiež, aby prístup k vzoru adresy URL „/ api / **”Je potrebné autentifikovať:

@EnableWebSecurity verejná trieda MultipleAuthProvidersSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Autowired CustomAuthenticationProvider customAuthProvider; @Override public void configure (AuthenticationManagerBuilder auth) vyvolá výnimku {auth.authenticationProvider (customAuthProvider); auth.inMemoryAuthentication () .withUser ("memuser") .password (encoder (). encode ("pass")) .roles ("USER"); } @Override protected void configure (HttpSecurity http) vyvolá výnimku {http.httpBasic () .and () .authorizeRequests () .antMatchers ("/ api / **") .authenticated (); } @Bean public PasswordEncoder passwordEncoder () {vrátiť nový BCryptPasswordEncoder (); }}

5.2. Konfigurácia XML

Prípadne, ak chceme použiť konfiguráciu XML namiesto konfigurácie Java:

6. Žiadosť

Ďalej vytvoríme jednoduchý koncový bod REST, ktorý je zabezpečený našimi dvoma poskytovateľmi autentifikácie.

Pre prístup k tomuto koncovému bodu je potrebné zadať platné užívateľské meno a heslo. Naši poskytovatelia autentifikácie overia poverenia a určia, či prístup povolia alebo nie:

@RestController verejná trieda MultipleAuthController {@GetMapping ("/ api / ping") public String getPing () {návrat "OK"; }}

7. Testovanie

Na záver si teraz otestujme prístup k našej zabezpečenej aplikácii. Prístup bude povolený, iba ak budú zadané platné poverenia:

@Autowired private TestRestTemplate restTemplate; @Test public void givenMemUsers_whenGetPingWithValidUser_thenOk () {ResponseEntity result = makeRestCallToGetPing ("memuser", "pass"); assertThat (result.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("OK"); } @Test public void givenExternalUsers_whenGetPingWithValidUser_thenOK () {ResponseEntity result = makeRestCallToGetPing ("externaluser", "pass"); assertThat (result.getStatusCodeValue ()). isEqualTo (200); assertThat (result.getBody ()). isEqualTo ("OK"); } @Test public void givenAuthProviders_whenGetPingWithNoCred_then401 () {ResponseEntity result = makeRestCallToGetPing (); assertThat (result.getStatusCodeValue ()). isEqualTo (401); } @Test public void givenAuthProviders_whenGetPingWithBadCred_then401 () {ResponseEntity result = makeRestCallToGetPing ("user", "bad_password"); assertThat (result.getStatusCodeValue ()). isEqualTo (401); } private ResponseEntity makeRestCallToGetPing (meno používateľa reťazca, heslo reťazca) {návrat restTemplate.withBasicAuth (meno používateľa, heslo) .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); } private ResponseEntity makeRestCallToGetPing () {return restTemplate .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); }

8. Záver

V tomto rýchlom návode sme videli, ako je možné v Spring Security nakonfigurovať viacerých poskytovateľov autentifikácie. Zabezpečili sme jednoduchú aplikáciu pomocou vlastného poskytovateľa autentifikácie a poskytovateľa autentifikácie v pamäti.

A tiež sme napísali testy na overenie, že prístup k našej aplikácii vyžaduje prihlasovacie údaje, ktoré môže overiť aspoň jeden z našich poskytovateľov autentifikácie.

Celý zdrojový kód implementácie nájdete ako vždy na GitHub.


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