RBAC 和 ABAC 有什么区别?权限系统怎么避免角色越建越多?
🧑💻 面试官:RBAC 和 ABAC 有什么区别?
🙋♂️ 我:RBAC 按角色授权,ABAC 按属性授权,后者更灵活。
🧑💻 面试官:假设员工只能读自己部门、金额低于某个范围的记录,你要建多少个角色?
🙋♂️ 我:可以给每个部门和金额范围各建角色。
🧑💻 面试官:部门变化、记录负责人变化、临时授权到期时,这些角色怎样持续保持正确?
先把「有哪些能力」与「在什么条件下能用」分开。角色装能力,属性表达条件,不必把每个条件都编成新角色。
面试速答(60 秒版)
RBAC 通过用户、角色和权限的关系管理授权。它适合职责相对稳定的能力分组,例如编辑、审核和系统管理。
ABAC 则结合主体、资源、操作以及环境等属性评估规则。例如用户所属部门是否与记录一致,记录是否在可操作状态,临时授权是否仍有效。
两者可以组合:角色决定基本能力,属性规则限制具体资源和条件。这样不必把部门、地区、金额和时间的每一种组合都创建成角色。
但灵活也带来治理成本。属性来源要可信,缺失或不确定时应明确处理,授权必须在服务端执行,并保留能解释拒绝或允许原因的记录。权限测试也要覆盖越权与规则冲突。

知识点详解:角色负责能力,属性负责条件
从角色爆炸的例子看边界
假设系统有编辑和审核两种职责,同时要求只能操作本部门记录。如果把部门直接并入角色,就会出现财务编辑、财务审核、销售编辑、销售审核等组合。
再加上地区、记录级别和临时有效期,角色数量会继续增长。真正的问题不是 RBAC 不能授权,而是我们把许多独立条件都塞进了角色名称。
可以保留编辑、审核这样的能力角色,再用资源部门与用户部门的关系限制范围。命名少了并不是最终目标,重要的是规则能独立解释和维护。
RBAC 管关系,ABAC 作规则判断
RBAC 关心谁被分配了什么角色,角色具有哪些权限;还可以有角色继承与职责分离等设计。它并不是只有一个管理员和一个普通用户。
ABAC 把一次授权需要的数据交给规则。例如主体是哪个部门的用户,资源属于谁,请求要读还是改,当前是否满足时间或设备条件。规则据此给出决定。
属性不只来自用户表。资源状态、授权关系和受信的环境信息也可能参与。不能让客户端提交一句「我是管理员」「记录属于我」,后端就直接当作可信属性。
组合以后,服务端怎样真正执行
假设某个用户有审核角色。角色提供审核能力,但服务端仍需读取目标记录,核对部门、状态与当前规则,然后决定是否执行。
前端隐藏按钮只是体验处理,不能代替服务端授权。列表查询也应按允许范围过滤,详情、修改和批量接口分别验证,避免「列表看不到,但猜 ID 能读到」。
如果检查与写入之间资源状态发生变化,还要通过事务、条件更新等方式保持约束。授权检查通过,不意味着后续任何时刻条件都继续成立。
灵活规则需要可解释与可测试
先定义默认拒绝、缺失属性怎样处理,以及多个规则冲突时的决策方式。不同策略系统可能有不同合并规则,不能随意假设「允许总能覆盖拒绝」。
规则变化后,要测哪些原本允许的操作被拒绝、哪些新增允许可能越权。可以准备主体、资源、操作、环境的测试矩阵,覆盖跨部门、过期、状态变化和批量部分授权。
审计记录应说明使用了哪个策略版本、关键属性与结果,同时避免把敏感数据完整抄进日志。权限缓存还要考虑撤权多久生效,不能永远沿用登录时的一份角色快照。
本题机制参考:NIST RBAC、NIST SP 800-162。
面试官继续追问
ABAC 一定比 RBAC 更好吗?
不是。条件少、职责稳定时,RBAC 更容易理解和运维;复杂条件才值得引入更精细规则,且可以组合。
有审核角色能审核自己提交的记录吗?
要看职责分离规则。角色只说明能力分组,是否允许自审还要明确建模,不能靠角色名称自动推断。
属性缺失时允许还是拒绝?
安全敏感操作应明确采取保守策略,并区分拒绝与系统无法判断。不要把 undefined 或数据读取失败默认为通过。
面试速记卡
- RBAC:用户—角色—权限,组织稳定能力。
- ABAC:主体、资源、操作、环境属性参与规则。
- 角色与条件可以组合,避免组合式角色爆炸。
- 服务端授权,可信属性,明确冲突和缺失规则。
- 撤权、并发变化和批量接口都要测试。
公司面试真题
这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。
浏览公司面试真题 →