JIT ProvisioningJust-In-Time Provisioning,即时用户开通)是在用户首次通过外部身份系统登录时,应用根据身份声明即时创建或更新本地账号的机制。

核心问题

接入 OIDC IdP 后,平台不一定预先拥有所有用户记录。但平台仍需要本地用户 ID、审批状态、角色、租户绑定和审计记录。JIT Provisioning 在首次登录时把外部身份转换成本地账号,避免手工批量导入用户。

核心机制

典型流程是:

  1. 平台验证 ID Token,得到 isssub
  2. (iss, sub) 查找本地身份绑定。
  3. 如果存在,更新邮箱、姓名、组等非关键资料。
  4. 如果不存在,创建本地用户记录。
  5. 根据策略决定状态:直接启用、待审批、只读、拒绝或绑定到租户。
  6. 后续 RBAC 判定只使用本地用户和角色模型。

最小数据模型可以是:

external_identity(issuer, subject) -> local_user_id
local_user(status, email, display_name)
user_role(local_user_id, role_id)

issuer + subject 共同构成外部身份主键。只用邮箱做主键会在邮箱改名、复用、大小写规则或不同 IdP 同邮箱用户时出错。

工程用途

  • 企业 SSO 首次登录自动创建后台用户。
  • 让管理员审批首次登录用户后再授予角色。
  • 同步姓名、邮箱、头像和组信息,但保留本地权限决策。
  • 支持从一个 IdP 迁移到另一个 IdP 时建立新旧身份映射。

边界与常见坑

  • JIT 不等于自动授权:创建用户记录后可以仍处于待审批或无角色状态。
  • 默认角色必须谨慎:默认给 admin 是严重权限漏洞。
  • 邮箱不是稳定身份:应以 iss + sub 绑定外部主体。
  • 属性同步要分等级:显示名可覆盖,角色和审批状态通常不应被任意外部 claim 覆盖。
  • 删除和离职仍要设计:JIT 解决创建,不自动解决禁用、回收和审计保留。

相关术语