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 决定该动作能作用在哪些数据行上。二者不是二选一,而是分层协作。
三、权限模型的数据结构设计
落地时至少需要五张核心表: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,立即失效所有会话。
- 注销与归档:注销后账号不可登录,但审计日志与操作记录须保留,满足合规追溯要求;居民注销时按法规处理健康数据留存或匿名化。
五、一个可执行的权限判定示例
假设医生张三(org=社区A,role=doctor)请求读取居民李四的评估报告。系统执行:第一步,RBAC 检查 doctor 是否拥有 assessment:read,结果为是;第二步,ABAC 检查资源属性:报告 owner=李四,李四与张三存在有效签约关系且同属社区A,敏感级别为“一般”,环境为工作时间内网,策略匹配 allow;第三步,账号状态为 active。三步通过,返回报告。若李四未签约或已解约,则第二步拒绝,接口返回 403 并写入审计。
这套模型的价值在于:新增角色时只需配置角色权限与策略,不必改动业务代码;数据边界由统一过滤层保证,避免“某个接口忘了加条件”导致越权;账号状态与权限解耦,停用账号立即阻断访问,而历史数据仍可追溯。对健康平台而言,权限模型既是技术组件,也是合规与信任的基础。