【问题标题】:How to get Keycloak realm and user attributes in Spring Cloud Gateway如何在 Spring Cloud Gateway 中获取 Keycloak 领域和用户属性
【发布时间】:2020-09-09 04:35:26
【问题描述】:

在带有 MVC 的 Spring Boot 中,可以通过在控制器方法中注入 Principal 来获取有关 Keycloak 用户领域和定义的属性的信息,该方法的类型为 KeycloakAuthenticationToken,它提供了此信息。

但在 Spring Cloud Gateway 中有依赖项

    implementation 'org.springframework.cloud:spring-cloud-security'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

以及通过

定义的安全性
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http,
            ReactiveClientRegistrationRepository clientRegistrationRepository) {
        // Authenticate through configured OpenID Provider
        http.oauth2Login();
        ...
}

安全有效,我设法通过过滤器检索到 Principal

.filter((exchange, chain) -> {

                            return exchange.getPrincipal().flatMap(p -> {
                                System.out.println("Pricnipal class: " + p.getClass());
                                OAuth2AuthenticationToken token = (OAuth2AuthenticationToken) p;
                                System.out.println("Token: " + token.getAuthorizedClientRegistrationId() + "|"
                                        + token.getPrincipal().getAttributes() + "|" + token.getDetails() + "|"+ token.getPrincipal().getClass());
                                System.out.println("Exchange Attr: " + exchange.getAttributes());
                                OidcUser oicdUser = (OidcUser)token.getPrincipal();
                                System.out.println("OicdUser: "+oicdUser.getClaims()+ "|" + oicdUser.getIdToken().getClaims()+"|"+oicdUser.getAttributes());
                                Authentication aut = (Authentication) p;
                                ServerHttpRequest request = exchange.getRequest().mutate().header("username1", p.getName())
                                        .header("roles1", aut.getAuthorities().toString()).build();
                                return chain.filter(exchange.mutate().request(request).build());
                            });

                        })

但它的类型是OAuth2AuthenticationToken。并且里面有关于经过身份验证的用户的基本信息,但没有通过 Keycloak 管理控制台定义的 Keycloak 领域或用户属性数据。

【问题讨论】:

    标签: keycloak spring-security-oauth2 spring-cloud-gateway


    【解决方案1】:

    实际上,它有效。发布的代码没有任何问题。我没有正确设置 Keycloak Mappers,这是向令牌添加属性所必需的。 配置完成后,上述方法足以从令牌中检索用户属性。 它们将位于OAuth2AuthenticationToken tokentoken.getPrincipal().getAttributes() 属性中。

    【讨论】:

    • 嗨@Vuk Djapic:我一直在尝试类似的事情,在我的请求中获取 OAuth2AuthenticationToken。但是我遇到的问题是我获得的令牌与我从 keylcoak 令牌端点获得的令牌不匹配。有什么方法可以获取 OIDC 令牌而不是 OAuth2 令牌?我已在我的问题stackoverflow.com/questions/63020779/… 中添加了所有详细信息
    猜你喜欢
    • 2020-09-11
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2019-11-06
    • 2018-12-18
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多