JIT Provisioning(Just-In-Time Provisioning,即时用户开通)是在用户首次通过外部身份系统登录时,应用根据身份声明即时创建或更新本地账号的机制。
核心问题
接入 OIDC IdP 后,平台不一定预先拥有所有用户记录。但平台仍需要本地用户 ID、审批状态、角色、租户绑定和审计记录。JIT Provisioning 在首次登录时把外部身份转换成本地账号,避免手工批量导入用户。
核心机制
典型流程是:
- 平台验证 ID Token,得到
iss和sub。 - 用
(iss, sub)查找本地身份绑定。 - 如果存在,更新邮箱、姓名、组等非关键资料。
- 如果不存在,创建本地用户记录。
- 根据策略决定状态:直接启用、待审批、只读、拒绝或绑定到租户。
- 后续 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 解决创建,不自动解决禁用、回收和审计保留。