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