3. 用户与角色体系

健康评估与干预计划平台的核心业务链条是“居民产生健康数据 → 医生给出评估结论 → 健康管理师落地干预计划 → 管理员维护平台秩序”。这条链条上每个角色的可见数据、可执行动作、可触达范围都不同,因此权限模型不是简单的“登录后能看什么”,而是决定数据边界、责任边界与合规边界的基础设施。本节围绕四类典型角色,讲清 RBAC 与 ABAC 如何配合、权限如何落到接口与数据行、账号从申请到注销如何闭环管理。

一、四类角色的职责与权限边界

先明确角色定位,再谈权限。居民是数据主体,只能访问自己的健康档案、评估报告与干预计划,可授权他人查看;医生关注被分配或签约的居民,可创建评估、下诊断结论、开干预建议,但不能修改居民自报数据;健康管理师负责执行干预,可查看居民档案与医生结论、记录随访与执行情况,但不应修改医生诊断;管理员负责账号、角色、机构、字典与审计,原则上不直接读写居民临床数据,只做平台治理。

这四类角色的权限差异可以归纳为三个维度:数据范围(本人 / 签约关系 / 机构 / 全平台)、操作类型(读、写、审、管)、敏感级别(一般健康数据、诊断结论、身份信息)。仅靠角色名无法表达“医生只能看自己签约居民”这类约束,这正是需要 RBAC 与 ABAC 组合的原因。

二、RBAC 与 ABAC 的分工

RBAC(基于角色的访问控制)解决“谁是什么角色、角色拥有哪些权限”的静态映射。典型做法是:用户 → 角色 → 权限(资源+动作),角色可继承。例如 doctor 继承 clinical_reader,再叠加 assessment:create、diagnosis:write。RBAC 的优点是易管理、易审计,缺点是难以表达“同一角色在不同数据对象上权限不同”。

ABAC(基于属性的访问控制)解决动态约束,用主体属性、资源属性、环境属性、动作属性共同判定。例如策略:当 subject.role = doctor 且 resource.ownerOrg = subject.org 且 resource.relation = signed 且 action = read 时允许。ABAC 能表达签约关系、机构归属、时间窗口、数据敏感级别等条件,但策略数量会随属性组合膨胀。

工程上推荐“RBAC 定骨架、ABAC 补边界”:先用 RBAC 决定角色能做什么动作,再用 ABAC 决定该动作能作用在哪些数据行上。二者不是二选一,而是分层协作。

多角色权限判定:RBAC 定动作,ABAC 定数据范围 访问请求 用户+动作+资源 RBAC 层:角色 → 权限 居民 resident 医生 doctor 健康管理师 管理员 admin 判定:该角色是否拥有此动作权限 ABAC 层:属性策略约束 主体:role / org / 签约关系 资源:owner / 敏感级别 / 状态 环境:时间 / 终端 / 访问来源 判定结果:允许 / 拒绝 动作通过 + 数据行过滤(行级权限) 数据范围落地示例(行级过滤条件) 居民:owner_id = 本人 医生:签约关系 = 有效 健康管理师:任务归属 管理员:仅治理数据 账号生命周期状态流转 申请 pending 激活 active 冻结 suspended 离职 disabled 注销 archived

三、权限模型的数据结构设计

落地时至少需要五张核心表:user(账号主体)、role(角色)、permission(权限点,形如 assessment:read)、user_role(用户角色关联)、role_permission(角色权限关联)。ABAC 策略可单独存于 policy 表,字段包括 effect(allow/deny)、subject_expr、resource_expr、action、priority。判定顺序建议:先按 priority 匹配策略,deny 优先于 allow,再叠加 RBAC 的动作白名单。

行级权限不要写死在业务代码里,而应统一在数据访问层注入过滤条件。例如医生查询居民列表时,DAO 自动追加 AND EXISTS (SELECT 1 FROM doctor_patient dp WHERE dp.doctor_id = :uid AND dp.patient_id = p.id AND dp.status = 'active')。这样即使新增接口,也不会遗漏数据边界。

四、账号生命周期管理

账号不是“建了就完”,而是有明确状态机:申请 → 审核 → 激活 → 正常使用 → 冻结/停用 → 注销归档。关键控制点包括:

  • 申请与审核:医生、健康管理师账号必须由机构管理员提交,附执业资质编号,审核通过后才可激活;居民可自助注册,但需实名认证后才能绑定医生。
  • 激活与首次登录:强制修改初始密码,绑定手机号或邮箱,生成首次登录审计记录。
  • 变更与冻结:角色变更需二次审批;连续登录失败 5 次自动冻结 30 分钟;离职或资质过期由管理员置为 disabled,立即失效所有会话。
  • 注销与归档:注销后账号不可登录,但审计日志与操作记录须保留,满足合规追溯要求;居民注销时按法规处理健康数据留存或匿名化。
权限判定的最小闭环可以概括为:先看角色有没有这个动作(RBAC),再看这条数据是否落在允许范围内(ABAC),最后看账号状态是否 active。三者任一不满足即拒绝,并记录审计日志。

五、一个可执行的权限判定示例

假设医生张三(org=社区A,role=doctor)请求读取居民李四的评估报告。系统执行:第一步,RBAC 检查 doctor 是否拥有 assessment:read,结果为是;第二步,ABAC 检查资源属性:报告 owner=李四,李四与张三存在有效签约关系且同属社区A,敏感级别为“一般”,环境为工作时间内网,策略匹配 allow;第三步,账号状态为 active。三步通过,返回报告。若李四未签约或已解约,则第二步拒绝,接口返回 403 并写入审计。

这套模型的价值在于:新增角色时只需配置角色权限与策略,不必改动业务代码;数据边界由统一过滤层保证,避免“某个接口忘了加条件”导致越权;账号状态与权限解耦,停用账号立即阻断访问,而历史数据仍可追溯。对健康平台而言,权限模型既是技术组件,也是合规与信任的基础。