На самом деле проект spring-oauth превращается в режим обслуживания, мы пытаемся перевести наше приложение в чистую Spring Security 5, которая также поддерживает конфигурацию сервера ресурсов.
Наша фактическая конфигурация сервера ресурсов выглядит следующим образом:
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests(
authorizeRequests -> {
authorizeRequests.antMatchers("/api/unsecured/**").permitAll();
authorizeRequests.anyRequest().authenticated();
}
);
}
@Bean
@ConfigurationProperties(prefix = "security.oauth2.client")
public ClientCredentialsResourceDetails clientCredentialsResourceDetails() {
return new ClientCredentialsResourceDetails();
}
@Bean
public TokenStore jwkTokenStore() {
return new JwkTokenStore("http://localhost:8080/...", new JwtAccessTokenConverter());
}
@Bean
public RequestInterceptor oauth2FeignRequestInterceptor(){
return new OAuth2FeignRequestInterceptor(new DefaultOAuth2ClientContext(), clientCredentialsResourceDetails());
}
@Bean
public OAuth2RestTemplate clientCredentialsRestTemplate() {
return new OAuth2RestTemplate(clientCredentialsResourceDetails());
}
}
и эти свойства:
security:
oauth2:
client:
client-id: service-id
client-secret: secret
access-token-uri: http://localhost:8081/oauth/token
Этот сервер ресурсов настроен для работы с токеном jwt. Для проверки токена используется ключ rsa publi c от ссылки, передаваемой в jwkstore. Он также может вызывать другой ресурсный сервер с Feign.
И это новая конфигурация:
@Configuration
static class OAuth2ResourceServerConfig extends WebSecurityConfigurerAdapter {
private final JwtDecoder jwtDecoder;
ResourceServerConfiguration(JwtDecoder jwtDecoder) {
this.jwtDecoder = jwtDecoder;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorizeRequests -> authorizeRequests
.antMatchers("/public/unsecured/**").permitAll()
.anyRequest().authenticated())
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.oauth2ResourceServer(oauth2ResourceServer -> oauth2ResourceServer
.jwt(jwtConfigurer -> {
jwtConfigurer.decoder(NimbusJwtDecoder.withJwkSetUri("http://localhost:8080/...").build());
jwtConfigurer.jwtAuthenticationConverter(tokenExtractor());
})
);
}
Эта конфигурация прекрасно работает для декодирования и проверки токенов, но Feign не работает. Предыдущая конфигурация с пружиной oauth2 поддерживает симметричный перехватчик Oauth2, который вызывает сервер авторизации для получения своего собственного токена доступа. Но я не знаю, как настроить это в Spring Security 5. Это поток, который мне нужен:
- внешний клиентский ресурс A для вызова клиента Spring с токеном
- сервер ресурсов. данные с сервера ресурсов B
- сервер ресурсов Сервер авторизации вызовов для получения токена доступа с типом гранта client_credentials
- сервер ресурсов Сервер ресурса B вызовов с установленным токеном доступа для запроса заголовка с помощью feign
- сервер ресурсов A возвращает все данные клиенту внешнего интерфейса
Можете ли вы сказать мне, как настроить 3. и 4. пошаговую защиту Spring 5 без проекта Spring oauth? Спасибо.