如何在Spring Cloud Gateway中获取Keycloak领域和用户属性

问题描述 投票:0回答:1

在带有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领域或用户属性数据。

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

keycloak spring-security-oauth2 spring-cloud-gateway
1个回答
0
投票

实际上,它有效。发布的代码没有错。我没有正确设置Keycloak映射器,这是向标记添加属性所必需的。通过配置,上述方法足以从令牌中检索用户属性。它们将位于token.getPrincipal().getAttributes()OAuth2AuthenticationToken token属性中。

© www.soinside.com 2019 - 2024. All rights reserved.