Используйте spring-security-oauth2-client только на стороне клиента - PullRequest
0 голосов
/ 30 марта 2020

Мы пытаемся использовать spring-security-oauth2-client Версия 5.3.0.RELEASE с потоком клиентских учетных данных. При этом мы пытаемся использовать его исключительно на стороне клиента, поэтому все конечные точки, такие как исполнительные механизмы, не должны быть защищены вообще.

В основном мы добавили учетные данные клиента следующим образом:

spring:
  security:
    oauth2:
      client:
        registration:
          my-client:
            authorization-grant-type: client_credentials
            client-id: foo
            client-secret: bar
            provider: my-provider
        provider:
          my-provider:
            tokenUri: http://token.uri/

Наш перехватчик выглядит следующим образом:

class OAuth2AuthorizedClientInterceptor implements ClientHttpRequestInterceptor {

  OAuth2AuthorizedClientManager manager
  String clientId
  AnonymousAuthenticationToken PRINCIPAL = new AnonymousAuthenticationToken("key", "anonymous", createAuthorityList("ROLE_ANONYMOUS"))

  OAuth2AuthorizedClientInterceptor(OAuth2AuthorizedClientManager manager, String clientId) {
    this.manager = manager
    this.clientId = clientId
  }

  @Override
  ClientHttpResponse intercept(
      HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
      throws IOException {
    OAuth2AuthorizeRequest authorizedRequest = OAuth2AuthorizeRequest
        .withClientRegistrationId(clientId)
        .principal(PRINCIPAL)
        .build()
    OAuth2AuthorizedClient authorizedClient = this.manager.authorize(authorizedRequest)
    if (!authorizedClient?.accessToken?.tokenValue) {
      throw new IllegalArgumentException("No access token for client '${clientId}'")
    }
    request.headers.setBearerAuth(authorizedClient?.accessToken?.tokenValue)
    return execution.execute(request, body)
  }
}

Это служба весенней загрузки и включает в себя зависимость spring-boot-autoconfigure в версии 2.2.5.RELEASE. Функциональность клиента работает нормально, но мы сталкиваемся с проблемой, заключающейся в том, что конечные точки привода больше не имеют свободного доступа, но также защищены oauth.

Это сбивает с толку, поскольку мы только что включили защиту пружины -oauth2-клиентская зависимость, а не зависимость от ресурса-сервера.

Мы нашли этот адаптер . Мы не уверены, что это единственное место для добавления защиты на стороне сервера, но чтобы отключить защиту, нам пришлось добавить следующую конфигурацию:

@Configuration
@Order(1)
class ManagedEndpointsAuthenticationConfig extends WebSecurityConfigurerAdapter {

  private static final String NOOP_PASSWORD_PREFIX = "{noop}"

  @Autowired
  SecurityProperties properties

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/actuator/**")
        .authorizeRequests()
        .requestMatchers(EndpointRequest.to("info")).permitAll()
        .requestMatchers(EndpointRequest.to("health")).permitAll()
        .requestMatchers(EndpointRequest.to("prometheus")).permitAll()
        .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR")
        .and()
        .httpBasic()
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    SecurityProperties.User user = properties.getUser()
    List<String> roles = user.getRoles()
    auth.inMemoryAuthentication()
        .withUser(user.name)
        .password(NOOP_PASSWORD_PREFIX + user.password)
        .roles(StringUtils.toStringArray(roles))
  }
}

Это похоже на странный взлом, поскольку мы просто хочу oauth2 на стороне клиента. Поэтому вопрос: как я могу использовать oauth2 с Spring-security JUST на стороне клиента?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

В руководстве по миграции весенней загрузки 2 предлагается что-то вроде того, что вы сделали:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#actuator -security

Но я использовал другой подход с зависимостью, которая имеет обе конфигурации для oauth-сервера и oauth-клиента. Это работает для меня:

Зависимость Maven:

        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>

Файл конфигурации:




@Configuration
public class OAuth2RestTemplateConfig {

    @Bean
    protected OAuth2ProtectedResourceDetails resource() {
        ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails();
        resource.setAccessTokenUri("https://oauth.server/oauth2/token");
        resource.setClientId("foo");
        resource.setClientSecret("bar");
        resource.setGrantType("client_credentials");
        return resource;
    }

    @Bean
    public OAuth2RestOperations oAuth2RestTemplate() {
        AccessTokenRequest atr = new DefaultAccessTokenRequest();
        return new OAuth2RestTemplate(resource(), new DefaultOAuth2ClientContext(atr));
    }
}

для использования, просто выполните:

@Autowired
private OAuth2RestOperations restOperations;
0 голосов
/ 30 марта 2020

А как же просто:

@Configuration
@EnableWebSecurity
class ManagedEndpointsAuthenticationConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().permitAll();
  }
}
...