Рубрики
Без рубрики

Поставщик аутентификации Spring Security

Как настроить пользовательский поставщик аутентификации с помощью Spring Security и конфигурации пространства имен.

Автор оригинала: 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 .