Flere godkendelsesudbydere i forårssikkerhed

1. Oversigt

I denne hurtige artikel vil vi fokusere på at bruge flere mekanismer til at godkende brugere i Spring Security.

Det gør vi ved at konfigurere flere godkendelsesudbydere.

2. Godkendelsesudbydere

En AuthenticationProvider er en abstraktion til at hente brugeroplysninger fra et specifikt lager (som en database, LDAP, brugerdefineret tredjepartskilde osv.). Det bruger de hentede brugeroplysninger til at validere de leverede legitimationsoplysninger.

Kort sagt, når der er defineret flere godkendelsesudbydere, bliver udbydere spurgt i den rækkefølge, de er erklæret for.

For en hurtig demonstration konfigurerer vi to godkendelsesudbydere - en tilpasset godkendelsesudbyder og en autentificeringsudbyder i hukommelsen.

3. Maven-afhængigheder

Lad os først tilføje de nødvendige forårssikkerhedsafhængigheder i vores webapplikation:

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

Og uden 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 

Den seneste version af disse afhængigheder kan findes på spring-security-web, spring-security-core og spring-security-config.

4. Tilpasset godkendelsesudbyder

Lad os nu oprette en brugerdefineret godkendelsesudbyder ved at implementere AuthneticationProvider interface.

Vi skal implementere godkende metode - som forsøger godkendelse. Input Godkendelse objektet indeholder brugernavn og adgangskode, der leveres af brugeren.

Det godkende metode returnerer en fuldt udfyldt Godkendelse objekt, hvis godkendelsen er vellykket. Hvis godkendelse mislykkes, kaster den en undtagelse af typen AuthenticationException:

@Komponent offentlig klasse CustomAuthenticationProvider implementerer AuthenticationProvider {@Override public Authentication authenticate (Authentication auth) kaster AuthenticationException {String username = auth.getName (); Strengadgangskode = auth.getCredentials () .toString (); hvis ("ekstern bruger" .equals (brugernavn) && "pass" .equals (password)) {returner nyt brugernavnPasswordAuthenticationToken (brugernavn, adgangskode, Collections.emptyList ()); } ellers {throw new BadCredentialsException ("Ekstern systemgodkendelse mislykkedes"); }} @Override offentlige boolske understøttelser (klasse-godkendelse) {return auth.equals (UsernamePasswordAuthenticationToken.class); }}

Naturligvis er dette en simpel implementering med henblik på vores eksempel her.

5. Konfiguration af flere godkendelsesudbydere

Lad os nu tilføje CustomAuthenticationProvider og en autentificeringsudbyder i hukommelsen til vores Spring Security-konfiguration.

5.1. Java-konfiguration

Lad os nu oprette og tilføje godkendelsesudbydere i vores konfigurationsklasse ved hjælp af AuthenticationManagerBuilder.

Først CustomAuthenticationProvider og derefter en udbyder af autentificering i hukommelsen ved hjælp af inMemoryAuthentication ().

Vi sørger også for, at adgang til URL-mønsteret “/ api / **”Skal godkendes:

@EnableWebSecurity offentlig klasse MultipleAuthProvidersSecurityConfig udvider WebSecurityConfigurerAdapter {@Autowired CustomAuthenticationProvider customAuthProvider; @ Override offentlig ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {auth.authenticationProvider (customAuthProvider); auth.inMemoryAuthentication () .withUser ("memuser") .password (encoder (). encode ("pass")) .roles ("USER"); } @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http.httpBasic (). Og () .authorizeRequests () .antMatchers ("/ api / **"). Godkendt (); } @Bean public PasswordEncoder passwordEncoder () {returner ny BCryptPasswordEncoder (); }}

5.2. XML-konfiguration

Alternativt, hvis vi vil bruge XML-konfiguration i stedet for Java-konfiguration:

6. Ansøgningen

Lad os derefter oprette et simpelt REST-slutpunkt, der er sikret af vores to godkendelsesudbydere.

For at få adgang til dette slutpunkt skal der angives et gyldigt brugernavn og en adgangskode. Vores godkendelsesudbydere validerer legitimationsoplysningerne og bestemmer, om de skal give adgang eller ej:

@RestController offentlig klasse MultipleAuthController {@GetMapping ("/ api / ping") offentlig String getPing () {returner "OK"; }}

7. Testning

Lad os endelig nu teste adgangen til vores sikre applikation. Adgang er kun tilladt, hvis gyldige legitimationsoplysninger leveres:

@Autowired privat TestRestTemplate restTemplate; @Test offentlig ugyldighed givenMemUsers_whenGetPingWithValidUser_thenOk () {ResponseEntity result = makeRestCallToGetPing ("memuser", "pass"); assertThat (result.getStatusCodeValue ()). er EqualTo (200); assertThat (result.getBody ()). er EqualTo ("OK"); } @Test offentlig ugyldighed givenExternalUsers_whenGetPingWithValidUser_thenOK () {ResponseEntity result = makeRestCallToGetPing ("externaluser", "pass"); assertThat (result.getStatusCodeValue ()). er EqualTo (200); assertThat (result.getBody ()). er EqualTo ("OK"); } @Test offentlig ugyldighed givenAuthProviders_whenGetPingWithNoCred_then401 () {ResponseEntity result = makeRestCallToGetPing (); assertThat (result.getStatusCodeValue ()). er EqualTo (401); } @Test offentlig ugyldighed givenAuthProviders_whenGetPingWithBadCred_then401 () {ResponseEntity result = makeRestCallToGetPing ("user", "bad_password"); assertThat (result.getStatusCodeValue ()). er EqualTo (401); } privat ResponseEntity makeRestCallToGetPing (String-brugernavn, String-adgangskode) {return restTemplate.withBasicAuth (brugernavn, adgangskode) .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); } privat ResponseEntity makeRestCallToGetPing () {return restTemplate .getForEntity ("/ api / ping", String.class, Collections.emptyMap ()); }

8. Konklusion

I denne hurtige vejledning har vi set, hvordan flere godkendelsesudbydere kan konfigureres i Spring Security. Vi har sikret en simpel applikation ved hjælp af en brugerdefineret godkendelsesudbyder og en in-memory-godkendelsesudbyder.

Og vi har også skrevet tests for at kontrollere, at adgangen til vores applikation kræver legitimationsoplysninger, der kan valideres af mindst en af ​​vores godkendelsesudbydere.

Som altid kan den fulde kildekode til implementeringen findes på GitHub.


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