Мы пытаемся использовать 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 на стороне клиента?