做产品 PMaker 首页
搜索
跟随系统
颜色主题
空格的键盘
用户看到的界面,应该等于他能做的事分三类权限页面、操作、数据,三类做法完全不同,数据权限最容易漏中间加一层角色RBAC:用户通过角色拿权限,加人加权限都变成配置界面默认不显示没权限的入口不渲染;只有能自行申请时才显示禁用前端隐藏只是体验,不是安全写进项目规则把权限规则写进 CLAUDE.md,每个接口都要独立校验后端必须再拦一遍

同一个账号,两种做法。左边把「不能做」留到点击之后才说,右边根本不显示。

权限即视图

没权限的功能不该显示出来再报错。

没权限的功能不该显示出来再报错。用户看到的界面,应该等于他能做的事。把没权限的东西显示出来再拦,等于让他每次都撞一次墙。

你会遇到的现象:

  • 点了才提示没权限,用户不知道该找谁开
  • 前端把按钮藏起来了,但接口没拦,改个请求就能越权
  • 加一个新角色要改十几个页面,因为权限是散在各处写死的

三类权限

先分清楚是哪一类,做法完全不同。

类型 控制什么 界面上表现为
页面权限 能看到系统里的哪些页面 导航菜单里有没有这一项。没权限就不出现
操作权限 能在页面上做哪些动作 按钮显不显示:查看、新增、修改、删除、审核
数据权限 同一个页面能看到哪些数据 列表里的条数不同。销售只看自己的客户

第三类最容易漏。页面和按钮都控制了,但接口返回了全部数据,前端只是没显示——这是很多越权问题的来源。

颗粒度上还可以再分一层:管理、编辑、预览。管理能分配权限和删数据,编辑能改内容,预览只能看。文档类产品还常有下载、上传、公开分享这些独立的开关。

RBAC 怎么搭

不要把权限直接绑在用户身上。中间加一层角色,加人和加权限就都变成了配置。角色是权限的集合,用户通过角色拿权限,部门、用户组也可以作为角色的来源;这套模型就是基于角色的访问控制(RBAC),大型系统里管理成百上千个用户时,它比逐个绑定权限省力得多。rbac-wiki

设计时按三步走:先列出有哪些角色(按组织架构分,或按系统结构分),再列出有哪些权限(页面、操作、数据三类),最后画一张角色乘权限的匹配表。这张表画出来,权限设计就完成了大半。

另一种模型是 ACL:给每个对象单独维护一份可访问名单。它更精确灵活,但每个对象都要维护一份,管理成本高得多,适合文件、文档这类需要逐个授权的场景。

界面上怎么处理

  • **没权限的入口直接不显示。**导航里不出现、按钮不渲染。这是默认做法。
  • **显示但禁用,只用在一种情况:他知道有这个功能,而且能自己去申请。**这时候禁用态要配一句「联系管理员开通」,否则等于什么都没说。
  • **后端必须再拦一遍。**前端隐藏只是体验,不是安全。接口不校验,改个请求就能越权(见理解技术里的安全常识)。
  • **数据权限要在查询层面过滤。**不是查出全部再在前端筛掉。
  • **权限变了要有反馈。**管理员刚给你开了权限,你得刷新才看得到,这时候最好有个提示。

给 AI 的话

把权限规则写进项目文件,每个接口、每块渲染都有据可依。

## 权限

模型:RBAC。用户 → 角色 → 权限,不要把权限直接绑在用户上。

权限分三类,每类都要实现:
- 页面权限:无权限时导航项不渲染,直接访问 URL 也要拦
- 操作权限:无权限时按钮不渲染,不要渲染后禁用
- 数据权限:在查询条件里过滤,不要查全量再在前端筛

颗粒度:管理 / 编辑 / 预览三档。

强制要求:
- 前端的隐藏只是体验优化,每个接口都必须独立校验权限,
  不能依赖前端不发请求。
- 新增任何接口时,先说明它需要哪个权限,再写实现。
- 涉及数据权限的查询,把过滤条件写进 SQL 或 ORM 查询,
  并在代码注释里说明过滤依据。

例外情况(显示但禁用)只用于:用户知道有这个功能且能自行申请,
此时禁用态必须带一句说明,告诉他找谁开通。

参考资料

  1. Role-based access control — Wikipedia