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

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

1. обзор

В этом руководстве будет показано, как настроитьAuthentication Provider in Spring Security, чтобы обеспечить дополнительную гибкость по сравнению со стандартным сценарием с использованием простогоUserDetailsService.

2. Провайдер аутентификации

Spring Security предоставляет множество вариантов для выполнения аутентификации. Они следуют простому контракту -an Authentication request is processed by an AuthenticationProvider, и возвращается полностью аутентифицированный объект с полными учетными данными.

Стандартная и наиболее распространенная реализация -DaoAuthenticationProvider, которая извлекает сведения о пользователе из простого пользовательского DAO, доступного только для чтения, -UserDetailsService. Эта служба сведений о пользователеonly has access to the username для получения полной сущности пользователя. Этого достаточно для большинства сценариев.

В других пользовательских сценариях по-прежнему потребуется доступ к полному запросуAuthentication, чтобы иметь возможность выполнить процесс аутентификации. Например, при аутентификации с помощью какой-либо внешней сторонней службы (такой какCrowd) -both the username and the password from the authentication request will be necessary.

Для этих более сложных сценариев нам потребуетсяdefine a custom Authentication Provider:

@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("org.example.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 OK с сервера:

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.

Полную реализацию этого руководства можно найти вthe GitHub project.