Сервисная связь с симуляцией весенней безопасности 5 - PullRequest
2 голосов
/ 19 марта 2020

На самом деле проект 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. Это поток, который мне нужен:

  1. внешний клиентский ресурс A для вызова клиента Spring с токеном
  2. сервер ресурсов. данные с сервера ресурсов B
  3. сервер ресурсов Сервер авторизации вызовов для получения токена доступа с типом гранта client_credentials
  4. сервер ресурсов Сервер ресурса B вызовов с установленным токеном доступа для запроса заголовка с помощью feign
  5. сервер ресурсов A возвращает все данные клиенту внешнего интерфейса

Можете ли вы сказать мне, как настроить 3. и 4. пошаговую защиту Spring 5 без проекта Spring oauth? Спасибо.

...