Dostawca uwierzytelniania Spring Security

1. Przegląd

Ten samouczek pokaże, jak skonfigurować dostawcę uwierzytelniania w Spring Security, aby zapewnić dodatkową elastyczność w porównaniu ze standardowym scenariuszem przy użyciu prostej usługi UserDetailsService .

2. Dostawca uwierzytelniania

Spring Security zapewnia różnorodne opcje przeprowadzania uwierzytelniania. Są śledzić umowę prosty - uwierzytelniania żądanie jest przetwarzane przez AuthenticationProvider i zwracana jest w pełni uwierzytelniony obiekt z pełnymi mandatów.

Standardową i najpowszechniejszą implementacją jest DaoAuthenticationProvider - który pobiera dane użytkownika z prostego DAO użytkownika tylko do odczytu - UserDetailsService . Ta usługa szczegółów użytkownika ma dostęp tylko do nazwy użytkownika w celu pobrania pełnej jednostki użytkownika. To wystarcza w większości scenariuszy.

Więcej scenariuszy niestandardowych nadal będzie wymagało dostępu do pełnego żądania uwierzytelnienia, aby móc przeprowadzić proces uwierzytelniania. Na przykład podczas uwierzytelniania w jakiejś zewnętrznej usłudze innej firmy (takiej jak Crowd) - zarówno nazwa użytkownika, jak i hasło z żądania uwierzytelnienia będą niezbędne .

W przypadku tych bardziej zaawansowanych scenariuszy będziemy musieli zdefiniować niestandardowego dostawcę uwierzytelniania :

@Component public class CustomAuthenticationProvider implements AuthenticationProvider { @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String name = authentication.getName(); String password = authentication.getCredentials().toString(); if (shouldAuthenticateAgainstThirdPartySystem()) { // use the credentials // and authenticate against the third-party system return new UsernamePasswordAuthenticationToken( name, password, new ArrayList()); } else { return null; } } @Override public boolean supports(Class authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } }

Zwróć uwagę, że nadane uprawnienia ustawione w zwróconym obiekcie uwierzytelniania są puste. Dzieje się tak, ponieważ władze są oczywiście specyficzne dla aplikacji.

3. Zarejestruj dostawcę autoryzacji

Teraz, gdy zdefiniowaliśmy dostawcę uwierzytelniania, musimy określić go w konfiguracji zabezpieczeń XML, korzystając z dostępnej obsługi przestrzeni nazw:

4. Konfiguracja Java

Następnie przyjrzyjmy się odpowiedniej konfiguracji Java:

@Configuration @EnableWebSecurity @ComponentScan("com.baeldung.security") public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationProvider authProvider; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authProvider); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated() .and().httpBasic(); } }

5. Wykonywanie uwierzytelniania

Żądanie uwierzytelnienia od klienta jest zasadniczo takie samo z tym niestandardowym dostawcą uwierzytelniania na zapleczu lub bez niego.

Użyjmy prostego polecenia curl, aby wysłać uwierzytelnione żądanie:

curl --header "Accept:application/json" -i --user user1:user1Pass //localhost:8080/spring-security-custom/api/foo/1

Na potrzeby tego przykładu zabezpieczyliśmy interfejs API REST przy użyciu uwierzytelniania podstawowego.

Otrzymujemy oczekiwane 200 OK z serwera:

HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=B8F0EFA81B78DE968088EBB9AFD85A60; Path=/spring-security-custom/; HttpOnly Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Sun, 02 Jun 2013 17:50:40 GMT

6. Wniosek

W tym artykule omówiliśmy przykład niestandardowego dostawcy uwierzytelniania dla Spring Security.

Pełną implementację tego samouczka można znaleźć w projekcie GitHub.