Indice dei documenti

组织身份与权限审计

本文说明宿舍管理系统如何用组织树与宿舍树交叉裁剪数据可见范围,以55个权限码与后端独立校验控制操作权限,并结合统一登录与日志留痕实现可追溯的权限审计。

  • 数据范围由组织树与宿舍树交叉裁剪并按“或”合并
  • 55个权限码覆盖读写,前端隐藏不代替后端校验
  • 六级角色有天花板,学生端进不了管理端接口
  • 操作、展示、限流三层留痕,导出必须留名单
  • 自定义字段可见性让权限从含糊变成可配置明细

明·如归 · 宿舍管理白皮书 | 第二篇 能力篇

上一章管的是数据的来路,现在管的是人的去处:谁能看哪栋楼、谁能批哪类单、谁在什么时候动过哪条记录。宿舍系统的权限设计有一处别的业务少有的难处——它要同时围着两棵树转:一棵是学校的人,一棵是学校的楼。

8.1 从一次越界查岗说起

某校有过这样的事:一位辅导员想查自己所带班级里住五号楼那几个学生的晚归记录,系统却让他看见了整栋楼四百人的作息——不是漏洞,是当初配权限的人想省事,给他开了"五号楼查看全部"。反过来那位管三栋楼的宿管,因为不属于任何学院,名单一个都看不到。

权限的错,一半是给多了,一半是给错了形状。 宿舍场景里这两半常常同时发生,因为人的组织归属和楼的空间归属根本不是一棵树上长出来的。

8.2 两棵树的交叉:数据范围怎么裁

系统里的数据可见范围由两组条件交叉裁出来:一组沿组织树走——学校、校区、学院、专业、班级,六级,学生和教师各有一棵;一组沿宿舍树走——校区、楼栋、楼层、房间。用户挂在哪一层,就看到那一层子树内的数据;负责宿管岗位的人,范围跟着楼走;带班的人,范围跟着班级走;两种范围可以并存,按"或"合并——这正好复现了开头那位辅导员真正该有的范围:本班学生 ∩ 全部楼栋。

这个模型不值一句"灵活"的夸奖,它值的是另一句话:新来一位楼长,不需要开发,不需要工单,管理员在组织树里把他挂对位置,他的世界就对了。 权限要人找代码,组织一调整权限就失真——多数学校的现状正是如此。

8.3 五十五道闸:每个动作单独过一遍

看得到,和做得动,是两件事。系统把后者拆成五十五个权限码,覆盖在控制器动作上——查是查、导是导、批是批、改是改,各过各的闸。

有三条纪律比清单本身更要紧。第一,前端隐藏按钮不能代替后端校验:菜单和按钮按权限渲染不假,但真正的把门在每个接口动作上独立发生——绕过页面直接提交,同样被五十五道闸之一拦下。第二,写操作从严于读操作:导入、删除、启用这类动作的权限码单独设置,不与查看共用;往他人床位打卡这种"身份冒用",不是靠权限码,是靠业务规则在接口里当场拒绝(第十章细谈)。第三,角色继承有天花板:管理员、管理人员、校领导、宿管、宿舍长、学生,六级角色各有各的端,学生端永远进不了管理端的路由——不是界面不给看,是接口根本不认。

权限设计的好恶,一看越权的成本,二看收权的成本。 给一个人收紧范围,应该和给他放宽一样只是拖拽树节点的动作;做不到,说明权限是焊死的,不是配置的。

8.4 登录:不让学校为身份再造一个账号

宿舍系统不该逼师生再记一套密码。系统内置十二条认证链可选:本地的账号口令作保底,标准协议接校园统一身份(CAS、OIDC 两类),平台侧接企业微信、微信与几家主流校园 App 的票据体系。一个学生从哪个入口进宿舍服务,就该带着那个入口已经确认过的身份——这是接入层的事,不该推给用户的记忆。

依赖第三方登录的部分,边界也说清:票据校验、账号映射、首登建号在服务端完成,第三方站点故障时保底口令入口仍在。统一的身份,不统一的风险。

8.5 看得见之外:不留影子的权限等于没有

权限解决了"谁可以",审计回答的是"谁真的做了"。宿舍数据里的敏感项不需要讨论要不要留痕——家长手机号、健康备注、作息轨迹,任何一条被谁看过、导出过,都必须有答案。

系统的留痕分三层。操作层:登录、增删改、导入导出进操作日志,写库前对内容做快照——事后不仅能知道"改过",还能还原"改成什么样、之前是什么"。展示层:敏感字段按角色脱敏——同一条记录,宿管看到的家长号码和处长看到的不是一张脸;页面输入统一清洗,防的是最古板的注入招数。限流层:登录每分钟十次、导入每分钟五次——既防撞库,也防误操作把系统当脚本刷。

有一层常被漏掉:导出要留名单。 谁在什么时间导出了哪栋楼的联系方式,行数可以复盘、字段可以复盘、事由将来也要能问得出来。宿舍数据出事,十有八九不是被黑,是被导出。

8.6 权限矩阵:把"不敢给"变成可讨论的问题

权限与审计做齐,最终要服务的其实是一个管理学问题:宿管该不该看到学生家长的电话? 大多数学校的真实答案是含糊的——"看情况"。含糊的代价是每次出事先查人。

系统给的回答方式是把含糊变成明细:字段级可见性配置(自定义字段可指定哪些角色可见)、导出与查看分码、每一次"看"都留痕。有了这三样,后勤处长可以安心给宿管开电话权限——因为他知道谁会看、看了有账;没有这三样,他只能全员不给,然后深夜让王师傅拿座机挨个打。

权限设计水平的分水岭就在这里:低水平的系统在"全给"和"全不给"之间摇摆,高水平的系统把决策拆成可配置、可追溯的小格。

8.7 一张表:权限与审计能力清单

能力当前状态要点
两棵树交叉裁范围已投产组织六级 + 宿舍四级
多范围按“或”合并已投产带班又管楼时自然合并
55 个权限码已投产读与写分开、导入与删除单设
后端独立校验已投产前端隐藏不代替后端把门
六级角色天花板已投产学生端进不了管理端接口
12 条认证链已投产本地保底 + 外部多链
字段级脱敏已投产同条记录不同角色不同列
三层留痕已投产操作 + 展示 + 限流
导出名单留底已投产行数、字段、操作人全部入日志
自定义字段可见性已投产健康备注仅校医可看
二步验证未投产高敏感操作可接短信
自动定岗定权限不做岗位调整永远由人确认

8.8 三条关于权限的常见误解

误解一:权限代码写完就安全。代码层只保证“他能不能”,不保证“他该不该”。后者需要业务规则(学生不能代打卡)与审计日志(他确实只查了自己该看的)共同成立。安全不是一门技术、是一门“接口 + 规则 + 日志”三层都硬的管理能力。

误解二:管理员不需要审计。恰恰相反——管理员的日志要记得更详,因为他们的权限最大、失控代价最高。系统里所有管理员行为、尤其是“看原值”、“导出”、“重置口令”三类,均入日志且不对他们本人隐藏。

误解三:菜单不展示等同于无权限。前端把按钮隐藏后,用户直接接口提交依然能动手——真正的把门一定在后端。系统里每一个写接口都在服务层重新判断一次权限、不依赖前端传递的任何“他能看到什么”的信号。

8.9 收口:给学校的一件事

落点不需要采购任何新东西:下学期开学前,把本校宿舍系统的账号按两棵树各核一遍——每个账号问两个问题:他管的楼和他管的人在范围里都齐吗;他做的每一件事,出了错能不能在日志里还原到秒。 两个问题答不上来的账号,宁可先收一半权限,再让厂商补功能。

人是各安其位了。下一件事是这套系统里最不能出错的那张表——床。