Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

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

2. Поставщик аутентификации

Spring Security предоставляет множество вариантов выполнения аутентификации. Эти опционы следуют простому контракту; запрос аутентификации обрабатывается AuthenticationProvider, и возвращается полностью аутентифицированный объект с полными учетными данными.

Стандартной и наиболее распространенной реализацией является DaoAuthenticationProvider, который извлекает сведения о пользователе из простого пользовательского DAO, доступного только для чтения, UserDetailsService . Эта служба сведений о пользователе имеет доступ только к имени пользователя , чтобы получить полную сущность пользователя, что достаточно для большинства сценариев.

Большему количеству настраиваемых сценариев по-прежнему потребуется доступ к полному запросу аутентификации , чтобы иметь возможность выполнить процесс аутентификации. Например, при аутентификации в каком-либо внешнем стороннем сервисе (таком как 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, используя доступную поддержку пространства имен:

<http use-expressions="true">
<intercept-url pattern="/**" access="isAuthenticated()"/>
<http-basic/>
</http>

<authentication-manager>
<authentication-provider
ref="customAuthenticationProvider" />
</authentication-manager>

4. Конфигурация Java

Далее мы рассмотрим соответствующую конфигурацию Java:

@Configuration
@EnableWebSecurity
@ComponentScan("com.foreach.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.

Полную реализацию этой статьи можно найти в проекте GitHub .