Keycloak邮件模板访问角色、分组等上下文变量的方法咨询
Keycloak 11.0.x 邮件模板访问用户角色、分组的实现方法
你需要的角色、分组数据不需要修改Java源码就能直接在ftl模板中获取,核心是利用FreeMarkerEmailTemplateProvider默认注入但未公开说明的session、realm上下文变量,具体实现方式如下:
前置说明
你之前拿到的user变量是封装后的ProfileBean对象,仅开放基础属性,我们可以通过user.attributes.id拿到用户唯一ID,再结合session、realm变量获取完整的用户模型对象。
1. 获取用户所属分组
在executeActions.ftl中插入以下代码即可遍历分组:
<#-- 获取完整用户模型 --> <#assign targetUser = session.users().getUserById(realm, user.attributes.id)> <#-- 遍历用户所有分组 --> <#list targetUser.groups as group> - 分组名称:${group.name} <#-- 可选:获取分组的自定义属性 --> <#if group.attributes?has_content && group.attributes['备注']?has_content> 分组备注:${group.attributes['备注'][0]} </#if> </#list>
2. 获取用户所属角色
领域级角色(全局角色)
<#list targetUser.realmRoleMappings as role> <#if !role.clientRole> - 领域角色:${role.name} </#if> </#list>
指定客户端的角色
<#-- 替换为你实际的客户端clientId --> <#assign appClient = realm.getClientByClientId("your-client-id")> <#list targetUser.getClientRoleMappings(appClient) as role> - 客户端角色:${role.name} </#list>
附:打印所有可用上下文变量
如果后续需要排查其他可用变量,直接在模板中插入以下代码即可输出所有内置变量名:
<#list .data_model?keys as varKey> ${varKey} </#list>
以上方法完全兼容官方Docker镜像,不需要修改任何Java代码,直接调整模板即可生效。
内容的提问来源于stack exchange,提问作者Adrian Kurzeja
相关产品推荐
相关产品推荐

