Автор оригинала: Eugen Paraschiv.
1. Обзор
В этом уроке будет показано, как настроить поставщика аутентификации в Spring Security , чтобы обеспечить дополнительную гибкость по сравнению со стандартным сценарием с использованием простого UserDetailsService .
2. Поставщик Аутентификации
Spring Security предоставляет множество вариантов выполнения аутентификации. Они следуют простому контракту – запрос Authentication обрабатывается AuthenticationProvider и возвращается полностью аутентифицированный объект с полными учетными данными.
Стандартной и наиболее распространенной реализацией является DaoAuthenticationProvider – который извлекает данные пользователя из простого, доступного только для чтения пользователя DAO- UserDetailsService . Этот UserDetailsService имеет доступ только к имени пользователя для получения полной сущности пользователя. Этого достаточно для большинства сценариев.
Другие пользовательские сценарии по-прежнему будут нуждаться в доступе к полному запросу Authentication , чтобы иметь возможность выполнить процесс аутентификации. Например, при аутентификации на каком – либо внешнем стороннем сервисе (например, Crowd ) – будут необходимы как имя пользователя , так и пароль из запроса аутентификации .
Для этих, более сложных сценариев нам нужно будет определить пользовательский поставщик аутентификации :
@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); } }
Обратите внимание, что предоставленные полномочия, установленные для возвращаемого объекта Authentication , пусты. Это происходит потому, что органы власти, конечно же, специфичны для конкретных приложений.
3. Зарегистрируйте поставщика аутентификации
Теперь, когда мы определили Поставщика аутентификации, нам нужно указать его в конфигурации безопасности XML, используя доступную поддержку пространства имен:
4. Конфигурация Java
Далее давайте взглянем на соответствующую конфигурацию 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. Выполнение Аутентификации
Запрос аутентификации от клиента в основном одинаков с этим пользовательским поставщиком аутентификации на задней стороне или без него.
Давайте используем простую команду curl для отправки аутентифицированного запроса:
curl --header "Accept:application/json" -i --user user1:user1Pass http://localhost:8080/spring-security-custom/api/foo/1
Для целей этого примера мы защитили REST API с помощью базовой аутентификации.
И мы получаем обратно ожидаемые 200 ОК с сервера:
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. Заключение
В этой статье мы рассмотрели пример пользовательского поставщика аутентификации для Spring Security.
Полную реализацию этого учебника можно найти в проекте GitHub .