You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:40:10