Keycloak如何决定登录成功后OidcUserInfo中包含的声明?
Keycloak 如何决定登录后 OidcUserInfo 中的声明内容?
Keycloak主要通过以下几个维度控制OidcUserInfo里的声明(也就是claims集合):
1. 客户端关联的权限范围(Scopes)
- 基础范围:
openid是必须项,只有勾选它,Keycloak才会返回OpenID Connect核心声明(比如sub即用户唯一ID)。额外的标准范围如profile(包含姓名、昵称等)、email(邮箱及验证状态)、phone(手机号信息),勾选后对应的声明会自动加入。 - 范围权限控制:客户端设置里的Full Scope Allowed开关,开启后客户端会获取该用户所有可用范围的声明;关闭后只能获取手动指定的「Assigned Default Scopes」和「Assigned Optional Scopes」内的内容。
2. 客户端映射器(Mappers)
这是自定义声明的核心方式:
- 内置映射器:Keycloak提供默认映射规则,比如把Keycloak用户ID映射为
sub声明,把用户所属角色映射到realm_access.roles或resource_access.{client-id}.roles中。 - 自定义映射器:在客户端的「Mappers」页面添加,比如选择
User Property类型,把Keycloak用户的自定义属性(如部门、职位)映射为自定义声明;也可以用Script Mapper编写脚本生成动态声明(比如根据用户所在组生成权限声明)。
3. Realm层面的全局配置
- 用户属性规则:在Realm的「User Profile」里定义的用户属性(必填/可选),只要通过映射器关联,就可以被加入到声明中。
- 全局默认范围:Realm设置里的「Default Default Scopes」会作为所有客户端的默认范围,比如全局默认勾选
email,所有客户端无需单独配置就能拿到邮箱相关声明。
4. OpenID Connect协议配置
- 在客户端的「OpenID Connect Compatibility Modes」中,部分开关会影响声明生成,比如「Always Include Claim in ID Token」可强制把某些声明直接放到ID Token里,Spring Security的OidcUser会直接从ID Token读取这些声明并填充到OidcUserInfo。
- 若客户端需要从UserInfo端点拉取额外声明,需确保客户端有访问该端点的权限,Spring Security会自动请求UserInfo端点并把返回的声明合并到OidcUserInfo中。
结合你的Spring Boot代码
你的getLoginUser()方法从SecurityContext中获取OidcUser,其中的OidcUserInfo是Spring Security根据Keycloak返回的ID Token和UserInfo响应组装而来,里面的claims集合完全由上述Keycloak的配置决定。
内容的提问来源于stack exchange,提问作者190303458
相关产品推荐
相关产品推荐

