Keycloak 令牌中缺少KeyClope组ID

Keycloak 令牌中缺少KeyClope组ID,keycloak,Keycloak,我目前正在设置一个新的KeyClope实例,并尝试实现以下目标: 用户将被放置在 -团体 -这些组将获得特定于客户端的角色 例如,我有“发布者”角色和几个发布者组:Publisher1、Publisher2、 因此,当用户登录时,我可以确定他是否是出版商,然后让他访问网站上的一组特定功能。 然后,小组应缩小他将收到的所有信息的范围 就像该角色将授予他访问RESTAPI的权限一样,该组将过滤他将收到的结果 在SQL中:SELECT*FROM xyz,其中publisher\u id=? 在令牌中,

我目前正在设置一个新的KeyClope实例,并尝试实现以下目标: 用户将被放置在 -团体 -这些组将获得特定于客户端的角色

例如,我有“发布者”角色和几个发布者组:Publisher1、Publisher2、

因此,当用户登录时,我可以确定他是否是出版商,然后让他访问网站上的一组特定功能。 然后,小组应缩小他将收到的所有信息的范围

就像该角色将授予他访问RESTAPI的权限一样,该组将过滤他将收到的结果

在SQL中:
SELECT*FROM xyz,其中publisher\u id=?

在令牌中,我想查看这些信息。使用评估功能时,我当前收到以下信息:

{
  "jti": "3e96fc9d-b1dc-428a-8f8e-0661f9cf265b",
  "exp": 1578303161,
  "nbf": 0,
  "iat": 1578302861,
  "iss": "https://prodo-sso-ti.ariva-services.de/auth/realms/PRODO",
  "aud": "account",
  "sub": "55bed571-dd3b-4282-8688-5da543517a49",
  "typ": "Bearer",
  "azp": "dashboard",
  "auth_time": 0,
  "session_state": "12ab2b8c-dc9a-42ca-b106-1a213dd38fc0",
  "acr": "1",
  "allowed-origins": [
    "https://secretlink"
  ],
  "realm_access": {
    "roles": [
      "offline_access",
      "uma_authorization"
    ]
  },
  "resource_access": {
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    },
    "dashboard": {
      "roles": [
        "Publisher"
      ]
    }
  },
  "scope": "openid profile email",
  "group_membership": [
    "/Publisher1"
  ],
  "email_verified": true,
  "name": "My Name",
  "preferred_username": "mb",
  "locale": "de",
  "given_name": "My",
  "family_name": "Name",
  "email": "my@name.de"
}
我激活了组成员映射器以获取用户所在的组。 问题是,我只得到组名,而我需要更有用的东西,比如ID。 因此,我尝试向组“publisher_id”添加一个属性,该属性的数值为“1”

如何在组成员信息或其他地方也获取此发布者id。 或者也许我走错了路,而这可以通过不同的方式实现


我非常感谢您的任何提示:)

通过此curl,您可以了解特定组可以使用哪些角色:

curl --location --request GET 'http://localhost:8080/auth/admin/realms/adanic/groups/35324d42-3299-4ed3-ad07-8c9ea8c02e9b/role-mappings/realm/available'
通过此curl,您可以获得具有特殊角色的用户列表:

curl --location --request GET 'http://localhost:8080/auth/admin/realms/adanic/roles/adanic-admin/users?first=0&max=100' \
--header 'Content-Type: application/json' \
--data-raw '{
   "roles": [
       {
           "id": "0830ff39-43ea-48bb-af8f-696bc420c1ce",
           "name": "user",
           "description": "${role_create-client}",
           "composite": false,
           "clientRole": true,
           "containerId": "kilid"
       }
   ]
}'

我希望它能有所帮助

你的问题现在有点老了,但我有一个类似的问题,甚至不可能在组中存储属性(因为我使用的是自定义的
UserStoreProvider

一个“简单”的解决方案可能是实现一个定制的
OIDCAccessTokenMapper
,并自己创建所需的令牌。基于
AbstractOIDCProtocolMapper
实现一个并不复杂

或多或少,您只需要用一个类(扩展抽象类)实现一个jar并将其部署到您的KeyClope中,该类由

@Override
protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession, KeycloakSession keycloakSession, ClientSessionContext clientSessionCtx)
并在spi描述符文件
org.keydeport.ProtocolMapper


然后,您必须在KeyClope客户端配置中激活“协议映射器”。

有一种简单的方法可以将组Id添加到令牌:

  • 为您的客户创建新的客户范围
  • 客户范围->创建->客户范围模板(受众模板)->您的客户名称

  • 在新的客户端范围内创建一个新的映射器
  • 客户端范围->您的客户端名称-/strong>->映射器->创建

  • 设置一些名称,映射器类型必须是脚本映射器
  • 然后将此代码粘贴到脚本部分:

    /**
     * Available variables: 
     * user - the current user
     * realm - the current realm
     * token - the current token
     * userSession - the current userSession
     * keycloakSession - the current userSession
     */
    
    
    //insert your code here...
    var groups = [];
    for each (var group in user.getGroups()) groups.push(group.getId());
    token.setOtherClaims("groups_ids", 
        Java.to(groups, "java.lang.String[]")
    );
    
    不要忘记设置添加到访问令牌

    您将在您的令牌中看到它:

    脚本映射器是否仅在较新版本的KeyClope中可用?我目前正在使用9.0.3,但没有在那里看到脚本映射器:(老实说,我没有使用以前的版本,所以我不知道:)尝试解决方案,我希望它能帮助您。但当我阅读此内容时,我发现脚本映射器将从管理控制台中删除,因为这不安全。从文档:管理员无法将脚本上载到服务器。此行为可防止意外执行恶意脚本时对系统造成潜在危害。管理员应始终使用JAR文件将脚本直接部署到服务器,以防止在运行时运行脚本时受到攻击。