我们做纸质档案数字化、电子档案管理系统、数字档案室建设,文中所有数据与踩坑均来自真实项目。
有档案数字化需求或技术交流,欢迎私信/评论区留言。
一、档案权限的特殊性:不是"用户-角色"就完了
一般业务系统的权限是"用户 → 角色 → 功能菜单"(RBAC)。档案系统在此基础上还有一层数据级权限——档案的可见范围是树状的:
全宗(一个单位/机构的所有档案) └─ 门类(文书、科技、会计、人事、照片…) └─ 案卷(一卷档案) └─ 文件(卷内具体文件)一个用户可能:能看 A 全宗文书档案的案卷级,但不能看 B 全宗;能看人事档案的文件级(因为他是人事科的),但看不到会计档案。权限要能作用到树的每一层,且层级间要能继承和覆盖。
二、四级权限模型的设计
核心设计:权限作用域 + 层级继承
权限 = 用户 × 操作(查看/下载/打印/编辑/删除) × 作用域(全宗/门类/案卷/文件)四个层级:
| 层级 | 权限粒度 | 典型授予对象 | 说明 |
|---|---|---|---|
| 全宗级 | 能看该全宗全部档案 | 档案馆管理员 | 最高数据级授权 |
| 门类级 | 能看该门类全部档案 | 各科室(人事科看人事类) | 最常见的授权粒度 |
| 案卷级 | 能看指定案卷 | 项目组、借阅人 | 借阅授权通常到案卷 |
| 文件级 | 能看指定文件 | 单个申请 | 最细粒度,如某份合同 |
继承规则(关键)
- 默认向下继承:全宗级授权 → 自动覆盖其下所有门类/案卷/文件;
- 允许向上覆盖:门类级的"禁止"可以覆盖全宗级的"允许"(比如某人能看全宗,但某门类是绝密,单独设为禁止);
- 显式 > 继承:文件级单独授权优先于继承来的案卷级权限。
defcan_access(user,archive_node,action):"""判断用户对某个档案节点的访问权限"""# 逐级向上找权限:文件 → 案卷 → 门类 → 全宗node=archive_nodewhilenodeisnotNone:perm=get_perm(user,node,action)ifperm=="deny":returnFalse# 显式禁止,立即拒绝ifperm=="allow":returnTrue# 显式允许node=node.parent# 未设置,向上继承returnFalse# 全链路未授权,默认拒绝默认拒绝(deny by default)是档案权限的铁律——没有授权就是不能访问,绝不默认放行。
三、权限的落地实现
实现方式对比
| 方式 | 优点 | 缺点 | 适用 |
|---|---|---|---|
| 数据库逐条存储权限 | 直观、可审计 | 权限记录量大(几千万档案逐条授权不现实) | 小体量、借阅授权 |
| 角色 + 规则表达式 | 灵活、存储小 | 规则复杂难排查 | 中体量 |
| 树节点授权 + 继承 | 兼顾粒度与存储量 | 实现稍复杂 | 生产推荐 |
我们的实现:树节点授权
- 档案树(全宗/门类/案卷/文件)上,授权只挂在"授权点"节点(通常是门类和案卷),文件级授权按需挂;
- 权限查询走缓存(节点权限树缓存 + 变更失效),避免每次访问都遍历数据库;
- 审计记录:每一次"权限授予/撤销"都记日志(谁、对谁、授了什么、谁批准的)。
权限与检索的联动
第 19 篇提到"权限过滤进索引"——检索时也要做权限收敛:
用户检索 → 查出候选文档 → 按权限过滤(ES filter + 应用层校验)双保险:ES 里用 permission_tag 粗筛(快),应用层再按树权限精校验(准)——防止绕过检索接口直接拼文档 ID 读取。
四、涉密档案的强化控制
涉密档案(涉密单位的绝密/机密/秘密档案)权限要特殊处理:
- 物理隔离:涉密档案系统和普通系统分离部署(物理隔离或网闸),涉密数据不进公网;
- 三员分立:系统管理员(管系统)、安全保密管理员(管权限)、安全审计员(管审计)三个角色相互独立、相互制约——一人不能同时兼任两个角色,这是保密要求(依据涉密信息系统分级保护要求);
- 双人授权:访问涉密档案需要两个授权人审批;
- 终端管控:涉密档案下载/打印走审批,带水印、绑定终端。
五、踩坑记录
坑 1:权限判断放在前端。早期版本前端根据角色隐藏按钮,后端不校验——结果有人直接调 API 绕过。教训:所有权限判断必须在后端,前端只是体验优化,不是安全边界。
坑 2:借阅到期权限不回收。借阅授权到期后没自动回收,读者一直能看。解法:授权带有效期 + 定时任务到期回收 + 到期提醒(到期前 3 天提醒续借或归档)。
坑 3:权限变更不通知。有人被撤权后,会话里还残留旧权限缓存。解法:权限变更 → 缓存失效 → 强制重新加载;敏感权限变更(撤权)立即踢下线重登。
坑 4:导出环节权限绕过。用户能看某些档案,但系统"批量导出"功能把整卷导出(包含他没权限的文件)。解法:导出前按单文件权限过滤,无权限的文件跳过并在导出清单里标注。
六、权限模型给客户的价值
权限模型是档案系统"专业性"的直接体现,也是项目验收重点:
- 客户问"你们系统怎么保证档案安全"——四级权限模型 + 默认拒绝 + 审计留痕,就是答案;
- 涉密客户问"能不能过保密要求"——三员分立 + 物理隔离 + 双人授权,是硬指标;
- 档案馆长问"谁看过这份档案"——审计日志一查便知。
七、小结
- 档案权限 = RBAC(功能权限)+四级数据级权限(全宗/门类/案卷/文件);
- 授权挂树节点 + 层级继承 +默认拒绝,是生产可行的模型;
- 检索、导出、借阅等所有出口都要做权限校验(后端强制);
- 涉密场景:物理隔离 + 三员分立 + 双人授权;
- 权限变更要失效缓存、审计留痕。