繁体   English   中英

如何从 KeyCloak 获取用户角色?

[英]How to get user roles from KeyCloak?

我正在尝试使用 keycloak-spring-security-adapter 在我们的应用程序中实现 SSO。 日志记录本身工作正常,但在应用程序内部,我们有基于用户角色/组的模块可用性,我无法从 SecurityContext 获取用户角色以仅向用户显示他们应该看到的内容。

    SecurityContext context = SecurityContextHolder.getContext();
    if(context.getAuthentication() != null) {
        KeycloakPrincipal principal = (KeycloakPrincipal) context.getAuthentication().getPrincipal();
        KeycloakSecurityContext session = principal.getKeycloakSecurityContext();
        AccessToken accessToken = session.getToken();
        AccessToken.Access realmAccess = accessToken.getRealmAccess();

        logger.info("KEYCLOAK ROLES: " + realmAccess.getRoles());

上面我的用户的记录器总是给出这个:

KEYCLOAK ROLES: [offline_access, uma_authorization]

这些不是在 keycloak 服务器中注册的角色,因为用于验证我的用户的角色是:

GSAP_APPLICATION_SUPPORT

我无法使用不是任何 keycloak 注册组成员的用户登录应用程序,所以这就是为什么我知道这个过程可以正常工作。

有没有办法根据 userId/token 从 keycloak 获取当前用户角色列表?

对服务内部的角色检查进行硬编码不是最佳实践,它是一种通过 API 划分基于角色的功能的常用方法,例如:

api/v1/admin/**, api/v1/user/**

使用它,您可以按角色限制对 API 的访问:

 http.authorizeExchange()
                            .pathMatchers("your_endpoint").hasAnyRole("desired_role");

PS请注意keycloak在rolename后面加了“ROLE_”前缀,这样就可以

  • 在您的配置中使用 ROLE_admin、ROLE_user

或者

  • 使用不带“ROLE_”前缀的角色名称(管理员、用户),并实现 JWT 身份验证转换器(Reactive (webFlux) 的示例,您可以对 Tomcat 执行类似操作):

Converter<Jwt, ? extends Mono<? extends AbstractAuthenticationToken>> getJwtAuthenticationConverter() {var converter = new ReactiveJwtAuthenticationConverter();
converter.setJwtGrantedAuthoritiesConverter(jwt -> {
    Map<String, Object> realmAccess = jwt.getClaim("realm_access");
    Collection<String> roles = (Collection<String>) realmAccess.get("roles");
    return Flux.fromIterable(roles.stream()
            .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                    .toList());
});
return converter;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM