Keycloak Java 适配器 - 检索角色列表

Posted

技术标签:

【中文标题】Keycloak Java 适配器 - 检索角色列表【英文标题】:Keycloak Java adapter - Retrieving roles list 【发布时间】:2018-07-18 03:38:30 【问题描述】:

我需要检索与用户关联的角色,但我正在使用 wildfly,我已经在 wildfly 和我的 Java 项目中安装了所有 jar keycloak,但是我可以通过 Java 适配器检索此列表吗?

其他选项是通过 get、post、put 等调用其他 api,就像任何 api 一样。但我的第一个选项是 Adapters。

我通过适配器进行身份验证,但我找不到任何方法来检索角色、客户端、领域等。

我错了还是适配器只是为了认证?

谁有好的例子?

【问题讨论】:

【参考方案1】:

在keycloak.json中设置use-resource-role-mappings : true选项 并且您应该能够按如下方式在 servlet 中获得角色

 KeycloakPrincipal principal = (KeycloakPrincipal)request.getUserPrincipal();

principal.getKeycloakSecurityContext().getToken().getResourceAccess("testclient").getRoles();

你也可以像这样从上下文中获取KeycloakPrincipal

  Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");
  Set<KeycloakPrincipal> principals = subject.getPrincipals(KeycloakPrincipal.class);

然后获取角色

【讨论】:

【参考方案2】:

谢谢,这里是另一种方式:(按名称检索一个角色)

Keycloak keycloak = Keycloak.getInstance("http://localhost/auth", "realm-name", "client-name", authorization);

RoleRepresentation role = keycloak.realm("realm-name").clients().get(idOfClient).roles().get(roleName).toRepresentation();

列出所有用户:

UsersResource users = keycloak.realm("realm-name").users();

而“授权”是字符串令牌持有者

“getInstance”还有其他发送方法,例如 pass 和 user。

【讨论】:

【参考方案3】:

如果其他人还在苦苦挣扎,这里有一个完整的答案:

    创建安全上下文生产者:
@RequestScoped
public class SecurityContextProducer 

    @Inject
    private HttpServletRequest request;

    @Produces
    public KeycloakSecurityContext getSecurityContext() 
        return ((KeycloakPrincipal) request.getUserPrincipal())
                .getKeycloakSecurityContext();
    

    像这样使用它:
    @Inject
    private KeycloakSecurityContext keycloakSecurityContext;

    public List<String> getRolesKeycloak() 
        Set<String> roleNames = keycloakSecurityContext.getToken().getRealmAccess().getRoles();
        List<String> targetList = new ArrayList<>(roleNames);
        return targetList;
    

【讨论】:

【参考方案4】:

这不完全是主题,但我需要找到与特定用户关联的角色,这个问题首先出现在我的关键字网络搜索中。这是对我有用的 keycloak 客户端 13.0.1

RealmResource realmResource = keycloak.realm(REALM);
UsersResource usersResource = realmResource.users();
UserResource userResource =  usersResource.get(USER_ID);
RoleMappingResource roleMappingResource = userResource.roles();
// either realmLevel or clientLevel
RoleScopeResource roleScopeResource = roleMappingResource.realmLevel();
List<RoleRepresentation> rolesRepresentation = roleScopeResource.listAll();

在别处没找到,希望有用。

【讨论】:

以上是关于Keycloak Java 适配器 - 检索角色列表的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Java/Kotlin API 从 KeyCloak 请求 JWT 令牌

Keycloak - 通过OIDC端点检索JWT令牌

Keycloak 客户端角色属性数组

403 spring-boot-2-keycloak-适配器

Keycloak 桌面 java 适配器删除 KEYCLOAK_IDENTITY cookie

Keycloak 验证错误