在Spring Boot with MVC中,可以通过控制器方法中的注入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();
...
}security works和我设法通过筛选器检索主体
.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领域或用户属性数据。
发布于 2020-05-22 22:37:04
实际上,它是有效的。发布的代码没有任何问题。我没有正确设置Keycloak映射器,这是向token添加属性所需的。完成上述配置后,上述方法就足以从令牌中检索用户属性。它们将位于OAuth2AuthenticationToken token的token.getPrincipal().getAttributes()属性中。
https://stackoverflow.com/questions/61953278
复制相似问题