当前位置: 首页 > 知识库问答 >
问题:

如何配置只承载=true时使用spring-boot-starter-oauth2-Client

何升
2023-03-14

我正在尝试使用keycloak为我的rest apis在Spring云网关中设置o auth2身份验证。keyclcoak将我的请求重定向到登录页面,同时将访问令牌作为承载令牌传递。在许多地方,我发现解决方案是在keycloak适配器中设置bearer-only=true。在使用spring-boot-starter-oauth2-Client时在哪里设置此项。我无法使用keycloak-spring-boot-starter在application.yml中设置此项

谢谢

共有1个答案

堵浩波
2023-03-14

我和你有同样的问题。由于没有找到答案,我开发了一个带有light Keyclope客户端的过滤器,该客户端调用Keyclope的Endpoint instrospect来验证令牌

客户:

public class KeycloakClient {

private final KeycloakConfigurationProperties kcProperties;
private final WebClient client;

public KeycloakClient(final KeycloakConfigurationProperties keycloakConfigurationProperties) {
    this.kcProperties = keycloakConfigurationProperties;
    this.client = WebClient.builder()
                           .baseUrl(keycloakConfigurationProperties.getAuth_server_url())
                           .filter(logRequest())
                           .build();
}

public Mono<Boolean> validateBearerToken(String bearerToken) {
    //todo: improve error management
    return prepareAndRunRequest(bearerToken).retrieve()
                                            .bodyToMono(KeycloakValidationResponse.class)
                                            .flatMap(response -> Mono.just(response.getActive()))
                                            .onErrorResume(WebClientResponseException.class,
                                                           ex -> Mono.just(false));
}

private WebClient.RequestHeadersSpec<?> prepareAndRunRequest(String bearerToken) {

    return client.post()
                 .uri(uriBuilder -> uriBuilder.path("/auth/realms/")
                                              .path(kcProperties.getRealm())
                                              .path("/protocol/openid-connect/token/introspect")
                                              .build())
                 .contentType(MediaType.APPLICATION_JSON)
                 .body(BodyInserters.fromFormData("client_id", kcProperties.getResource())
                                    .with("client_secret", kcProperties.getCredentials_secret())
   

过滤器:

public class ValidationTokenGatewayFilterFactory extends AbstractGatewayFilterFactory<ValidationTokenGatewayFilterFactory.Config> {

private final KeycloakClient client;

public ValidationTokenGatewayFilterFactory(KeycloakClient client) {
    super(Config.class);
    this.client = client;
}

@Override
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {

        String token = exchange.getRequest()
                               .getHeaders()
                               .get(AUTHORIZATION)
                               .get(0);

        token = token.substring(7);

        log.trace("-- ValidationToken(): token={}", token);

        return client.validateBearerToken(token)
                     .flatMap(validated -> {
                         if (validated) {
                             log.debug("-- ValidationToken(): Token valid");
                             return chain.filter(exchange);
                         } else {
                             log.debug("-- ValidationToken(): Token invalid");
                             exchange.getResponse()
                                     .setStatusCode(HttpStatus.UNAUTHORIZED);

                             return exchange.getResponse()
                                            .setComplete();
                         }
                     });
    };
}

public static class Config {
}

}

你可以在这里找到完整的样本:https://gitlab.com/-/snippets/2105967

 类似资料:
  • 简介 ShardingSphere-JDBC 提供官方的 Spring Boot Starter,使开发者可以非常便捷的整合 ShardingSphere-JDBC 和 Spring Boot。 数据源配置 spring.shardingsphere.schema.name= # JDBC数据源别名 spring.shardingsphere.datasource.names= # 数据源名称,

  • 我想在Spring Boot 2.4中添加Azure AD作为OAuth2提供程序。我遵循了Spring Boot的OAuth2文档,并提出了以下配置: 为了完整起见,这是我的网络安全配置: 在上输入凭据返回时https://login.microsoftonline.com,我得到以下错误: 问题源于DefaultJWTProcessor。Nimus JOSE JWT提供的java。 通过查看F

  • 我目前正在学习如何使用Spring Boot。到目前为止,我从未使用过像Spring这样的框架,而是直接使用文件(FileInputStream等) 我还发现了doc:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html,但我现在知道如何将它应用到我的项目中

  • 我不想重复前面的其他线程。虽然这是一个已知的问题,但我没有看到任何地方对此进行跟踪。如果它被跟踪,请给我指出正确的方向。 目前spring-授权-server与Spring Boot 2.5. x一起使用。众所周知,与spring-boot-starter-oauth2-client实现以及Jwt令牌和spring-授权-server的令牌不一致。 这意味着您可以使用spring Boot 2.6

  • 引入 Maven 依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>${shardingsphere.version}</version> </d

  • 引入 Maven 依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>${shardingsphere.version}</version> </d