登录运行上下文契约说明
查看文档来源信息
- 来源目录:
addons/sys_base/docs - 来源文件:
契约说明/登录运行上下文契约说明.md
上下文定义
- 正式运行上下文只分两种:
role、super_admin。 role上下文来源于sys_user_authority、sys_authority_app、sys_authorities.addons_type的交集结果。super_admin上下文来源于sys_users.is_super_admin=true,不依赖任何角色记录。
候选上下文规则
- 候选上下文 = 当前应用 + 当前模块下可用的普通角色上下文。
- 用户
is_super_admin=true时,再额外追加一个super_admin上下文。 - “1 个普通角色 + 超级管理员”属于两个候选上下文。
- “多个普通角色 + 超级管理员”同样属于多个候选上下文。
登录选择顺序
- 请求明确指定了
accessMode + authorityId时,优先按本次指定进入。 - 未指定时,先读取
sys_user_auth_addons中当前app-id + addons-type的上次运行上下文。 - 上次上下文仍有效时直接进入,不弹选择框。
- 上次上下文无效时重新计算候选上下文。
- 候选上下文只有一个时直接进入。
- 候选上下文大于一个时返回选择列表。
- 当前模块没有普通角色,但用户是超级管理员时,直接进入
super_admin上下文。 - 当前模块没有普通角色且用户不是超级管理员时,明确失败。
上次运行上下文存储
sys_user_auth_addons的正式语义是“上次运行上下文”,不再是“上次角色”。- 表结构正式包含
access_mode字段,当前值只允许role、super_admin。 role模式下authority_id必须是有效角色 ID。super_admin模式下authority_id正式允许为0。- 历史数据未写
access_mode时按role处理。 - 中间件管理端更新用户角色后,若
role模式的上次运行上下文指向已被移除的角色,必须清理该上下文,后续登录或切换时重新计算候选上下文。
JWT 与 CommonScope 口径
- JWT / Claims / CommonScope 必须同时表达:
accessModeisSuperAdminisSuperAdminContextselectedAuthorityId
super_admin上下文下:accessMode=super_adminisSuperAdmin=trueisSuperAdminContext=trueselectedAuthorityId=0roleId=0
role上下文下:accessMode=roleisSuperAdmin表示账号身份isSuperAdminContext=falseselectedAuthorityId为当前角色 ID
菜单与权限运行时规则
super_admin上下文下,菜单运行时返回当前模块已发布正式菜单的完整树。super_admin上下文下,页面与动作权限全量放行。role上下文下,菜单运行时与权限运行时继续按角色授权结果生效。- 任何运行时接口都不得因为
super_admin上下文的selectedAuthorityId=0直接报错。
登录审计规则
- 登录主链路只负责认证、上下文解析、会话创建、token 返回和登录记录落库。
- 登录记录中的 IP 归属地属于审计补充信息,不得参与登录成败、默认页、菜单或权限判断。
- 本地和内网 IP 不访问公网归属服务,直接记录为“本地地址”或“内网地址”。
- 公网 IP 归属查询必须异步执行;公网归属服务超时、失败或返回未知时,不得阻塞登录响应。
切换规则
- 头部切换列表必须展示当前模块下所有普通角色上下文。
- 当前账号是超级管理员时,切换列表必须额外展示“超级管理员”。
- 普通角色与超级管理员上下文允许双向切换。
- 切换成功时,后端必须先创建新 session 并换发新 token,再写回当前模块运行上下文,最后失效旧 session。
- 切换成功后,前后端都必须重建用户资料、菜单、默认页、权限状态。
- 超级管理员切到普通角色后,后端所有正式治理接口都必须回到
role口径校验;切回super_admin后再按超管上下文正式放行。
不允许的做法
- 不允许新增伪超级管理员角色。
- 不允许往角色表、用户角色表、角色应用表里插假数据伪造超级管理员能力。
- 不允许保留“超级管理员必须先有角色才能登录”的旧逻辑。
2026-04-24 联调补充口径
- 超级管理员是否放行,正式依据是当前运行上下文
accessMode=super_admin与isSuperAdminContext=true,不是“账号本身是超管用户”这一条单独条件。 - 超级管理员用户切到普通角色上下文后,所有正式治理接口都必须回到
role口径校验,不得再按超管用户身份直接越过角色授权。 - 菜单运行态、角色授权状态、Key 管理、校区管理、图片管理、运行日志、字典管理、请求日志、登录日志、系统配置等正式治理接口,均按当前上下文进入正式判定链路。
- 普通角色上下文读取自身授权状态属于正式允许场景;普通角色上下文伪装读取
super_admin状态属于正式拒绝场景。 - 本轮真实联调已确认:超级管理员账号在部门页可从普通角色上下文切回
super_admin,且日志正式落出selectedAuthorityId=0、accessMode=super_admin。