如何从 Spring 引导管理员访问 oAuth2 安全性后面的执行器端点



我有由oAuth2保护的弹簧启动应用程序,只有在执行器端点不受保护时,我才能从弹簧启动管理员访问应用程序。我已经检查了 github 上的安全样本,即使那里/运行状况端点不安全。有没有办法从弹簧引导管理员访问带有由 oAuth2 保护的执行器端点的 spring 引导应用程序。

根据 WIPU 的答案,我创建了简单的更新

public class BearerAuthHeaderProvider implements HttpHeadersProvider {
private final OAuth2RestTemplate template;
public BearerAuthHeaderProvider(OAuth2RestTemplate template) {
this.template = template;
}
public HttpHeaders getHeaders(Instance ignored) {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", template.getAccessToken().getTokenType() + " " + template.getAccessToken().getValue());
return headers;
}
}

@Configuration
public class AdminServerConfiguration extends AdminServerAutoConfiguration {
public AdminServerConfiguration(AdminServerProperties adminServerProperties) {
super(adminServerProperties);
}
@Bean
public OAuth2ProtectedResourceDetails clientCredentialsResourceDetails() {
ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
//set you details here: id, clientid, secret, tokenendpoint
details.setClientId("actuator");
details.setClientSecret("actuator_password");
details.setAccessTokenUri("http://localhost:8081/auth-server/oauth/token");
details.setGrantType("client_credentials");
return details;
}
@Bean
@Order(0)
@ConditionalOnMissingBean
public BearerAuthHeaderProvider bearerAuthHeaderProvider(){
// couldn't inject differently restTemplate 
OAuth2ProtectedResourceDetails resourceDetails = this.clientCredentialsResourceDetails();
OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(resourceDetails);
return new BearerAuthHeaderProvider(oAuth2RestTemplate);
}
}

这个问题很老了,但因为根本没有答案。

在引导管理员的de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration.类中,您可以找到方法basicAuthHttpHeadersProviderhttpHeadersProvider。您可以使用此机制添加自己的标头提供程序。只需提供您自己的 AuthHeaderProvider。如下所示:

@Bean
public BearerAuthHeaderProvider bearerAuthHeaderProvider(OAuth2RestTemplate template){
return new BearerAuthHeaderProvider(template);
}
@Bean
public OAuth2RestTemplate restTemplate(OAuth2ProtectedResourceDetails resourceDetails) {
return new OAuth2RestTemplate(resourceDetails);
}
@Bean
public OAuth2ProtectedResourceDetails clientCredentialsResourceDetails() {
ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails ();
//set you details here: id, clientid, secret, tokenendpoint
details.setGrantType("client_credentials");
return details;
}

这样,InstanceWebClient.builder()将拾取您的持有者身份验证标头并将其发送到您的执行器端点。

我不确定这是否是正确的解决方案,但这是一个起点。

问候

最新更新