我当前正在设置一个新的KeyCloak实例,并且我试图实现以下目标: 用户将被放置在 -团体 -这些组将获得客户特定的角色
例如,我具有“发布者”角色和几组发布者:Publisher1,Publisher2,...
因此,当用户登录时,我可以确定他是否是发布者,然后授予他访问网站上一组特定功能的权限。 然后,各组将缩小他将收到的所有信息的范围。
就像该角色将授予他访问REST API的权限一样,该小组将过滤他将收到的结果。
在SQL中:SELECT * FROM xyz where publisher_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”。
如何在组成员身份信息或其他地方也获取此Publisher_id。 还是我走错路了,这可以通过某种方式实现?
我很感谢您的提示:)
答案 0 :(得分:2)
有一种简单的方法可以将网上论坛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[]")
);
别忘了设置添加访问令牌。
您将在令牌中看到它: groups_ids
答案 1 :(得分:0)
您的问题现在有点老了-但我有一个类似的问题,甚至没有可能将属性分组存储(因为我使用的是自定义UserStoreProvider
)。
“简便”的解决方案可能是实施自定义OIDCAccessTokenMapper
并自行创建所需的令牌。实施基于AbstractOIDCProtocolMapper
的代码并不是很复杂。
或多或少,您只需使用一个实现(并扩展实现)的单一类(扩展抽象类)来实现并将jar部署到密钥斗中
@Override
protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession, KeycloakSession keycloakSession, ClientSessionContext clientSessionCtx)
并在spi描述符文件org.keycloak.protocol.ProtocolMapper
然后,您必须在密钥斗篷客户端配置中激活“协议映射器”。