如何在Keycloak中根据用户组配置不同的Scope?
Keycloak 按用户组动态添加Scope的实现方案
可行,通过客户端范围、组属性和映射器的组合配置即可实现需求,具体步骤如下:
1. 创建自定义客户端范围
- 在Keycloak后台进入「客户端范围」页面,分别创建
groupa和groupb两个自定义客户端范围,类型选择「可选」即可。
2. 为用户组添加标识属性
- 找到A组,进入「属性」标签页,添加属性
scope,值设为groupa; - 同理为B组添加
scope属性,值设为groupb。
3. 配置客户端映射器动态注入Scope
- 进入目标客户端,切换到「映射器」标签页,点击「创建」;
- 选择映射器类型为Script Mapper(脚本映射器,Keycloak 11及以上版本支持);
- 配置参数:
- 名称:自定义(如
Dynamic Group Scope Injector) - 脚本类型:选择
Access Token(如需在ID Token中也生效,可同时选择ID Token) - 脚本内容:
// 获取用户所有组的scope属性 const scopes = []; const groups = user.getGroups(); groups.forEach(group => { const groupScope = group.getFirstAttribute("scope"); if (groupScope) scopes.push(groupScope); }); // 合并原有scope与组关联scope const existingScopes = token.getScope(); scopes.forEach(scope => { if (!existingScopes.contains(scope)) { existingScopes.add(scope); } }); // 更新Token的scope字段 token.setScope(existingScopes);
- 名称:自定义(如
- 保存映射器。
4. 基础配置验证
- 确保目标客户端已将
profile添加到「默认客户端范围」中(在客户端的「范围」标签页配置); - 若Keycloak禁用了脚本功能,需在配置文件(如
keycloak.conf)中开启:spi-scripting-allow-scripts=true。
完成配置后,用户A登录生成的Token中scope字段会包含profile和groupa,用户B则包含profile和groupb。
内容的提问来源于stack exchange,提问作者Maleko
相关产品推荐
相关产品推荐

