1. Обзор
В этом руководстве мы узнаем, как настроить поставщика аутентификации в Spring Security, обеспечивая дополнительную гибкость по сравнению со стандартным сценарием с использованием простого UserDetailsService.
2. Authentication Provider
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);
}
}
Обратите внимание, что предоставленные права доступа, установленные для возвращенного объекта аутентификации , пусты. Это связано с тем, что полномочия, конечно, зависят от приложения.
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.baeldung.security")
public class SecurityConfig {
@Autowired
private CustomAuthenticationProvider authProvider;
@Bean
public AuthenticationManager authManager(HttpSecurity http) throws Exception {
AuthenticationManagerBuilder authenticationManagerBuilder =
http.getSharedObject(AuthenticationManagerBuilder.class);
authenticationManagerBuilder.authenticationProvider(authProvider);
return authenticationManagerBuilder.build();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
return http.build();
}
}
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.
Оригинал статьи: https://www.baeldung.com/spring-security-authentication-provider