Files
autumn-recruitment/07.模式/auth/RBAC 权限模型_test.md
T

143 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [test/review, auth, pattern, rbac]
create time: 2026-08-09 12:00
---
# RBAC 权限模型 — 测试题
## 概述
本测试覆盖 RBAC 五张表设计、用户→角色→权限两层映射、超级管理员继承机制、互斥职责分离(SoD)以及动态权限加载流程。共 10 道题目(6 选择 + 3 填空 + 1 简答)。
---
## 一、选择题(6道,由浅入深)
> **难度阶梯**: Q1-Q2 基础概念 → Q3-Q4 核心原理 → Q5-Q6 深入应用/边界场景
### Q1(基础)— 考察定义层面
RBAC 的核心思想是:
A. 直接将用户与权限绑定
B. 将用户与角色关联,而非将用户与权限直接绑定
C. 根据用户的部门自动分配所有权限
D. 基于用户的行为模式动态生成权限
### Q2(基础)→
以下哪个表**不是**标准 RBAC 五张表中的一部分?
A. users(用户表)
B. roles(角色表)
C. user_roles(用户-角色关联表)
D. permissions(权限表)
E. role_hierarchy(角色层级表)
### Q3(进阶)— 核心原理
RBAC 引入角色层相比传统 ACL(Access Control List)的最大优势是什么?
A. 权限检查更快
B. 批量授权更简单——只需改角色的权限映射不影响用户
C. 支持更多种权限码格式
D. 不需要数据库支持
### Q4(进阶)— 比较/辨析
关于 RBAC 中的互斥职责分离(Separation of Duty),以下说法哪个是正确的?
A. 应该在每次鉴权时检查互斥约束
B. 应该在分配角色层校验,而不是每次鉴权时检查
C. 只在创建角色时检查一次就够了
D. SoD 只在财务系统中需要,其他系统不需要
### Q5(深入)— 场景推理
某中型业务系统有约 500 个用户、20 个角色、每种角色 10~30 个权限。以下哪种部署方案最合理?
A. 简单角色 + 硬编码判断即可
B. 标准五表 RBAC + Redis 缓存(O(1) 鉴权)
C. 平台型 SaaS 的每租户自定义角色
D. 只做 ACL 逐个绑定用户和权限
### Q6(深入)— 源码级/边界场景
在查询某用户全部权限并展开角色继承时,如果该用户有一个 `is_super = 1` 的角色,函数应该返回什么?
A. 空列表表示需要进一步展开
B. 该角色的直接权限码列表
C. `["*"]` 表示拥有所有权限
D. 报错"超级管理员不应直接查询权限"
---
## 二、填空题(3道)
### F1 — 填空1
RBAC 五张标准表的 ER 关系是:users 多对多通过 _____ 关联到 roles;roles 多对多通过 _____ 关联到 permissions。这两个关联表是 RBAC 灵活性的关键。
> **提示**: 回想五个表的名称。
### F2 — 填空2
登录时将完整权限树缓存在_____中,鉴权接口只需 O(1) 读取缓存。权限变更时主动删除对应用户的缓存条目实现最终一致。**不要每次都查库**。建议 TTL 设为 _____。
> **提示**: 第一个空填存储技术;第二个空填时间长度。
### F3 — 填空3
金融类强合规系统的 RBAC 部署应包含:标准五表 RBAC + SoD 互斥约束 + 完整的_____日志。审计日志记录每次权限操作以供合规审查。
> **提示**: 四个字的名词,描述安全相关的记录行为。
---
## 三、简答题(1道)
### S1
面试官问:"一个电商后台系统有以下角色需求:运营人员可以查看商品列表但不能编辑;编辑可以修改商品信息但不可删除;管理员拥有所有权限但受 SoD 限制——同一个人不能同时拥有'采购'和'审核'角色。请设计一套 RBAC 方案,包括表结构、权限码命名规范、互斥规则配置以及运行时鉴权流程。"
> **答题框架提示**:
> 1. 角色与权限码设计
> 2. 互斥约束的配置方式
> 3. 鉴权流程与缓存策略
> 4. 异常场景处理
---
## 参考答案与解析
### 选择题答案
| 题号 | 正确答案 | 解析 |
|------|---------|------|
| Q1 | B | RBAC 的核心是将用户与角色关联(而非直接绑定权限)。这层间接大幅降低管理复杂度——调整某个角色的权限只改一处映射,不需要遍历所有用户。 |
| Q2 | E | 标准五表是:users、roles、permissions、user_roles、role_permissions。role_hierarchy 不是独立表——原文用 parent_id 字段在 roles 表中实现层级关系。 |
| Q3 | B | ACL 的问题是批量授权需逐一修改每个用户;RBAC 只需改角色的权限映射。速度不是主要差异,灵活性才是核心价值。 |
| Q4 | B | 原文明确指出:互斥约束应在**分配角色层**校验,而不是每次鉴权时检查。前者是策略问题后者是执行问题——入口处挡住比到处拦击效率高得多。 |
| Q5 | B | 小型系统(<100 用户)可用硬编码;中型系统用标准五表+Redis 缓存;SaaS 需要租户隔离;ACL 不适合超过几个人的规模。500 用户属于中型。 |
| Q6 | C | 当 is_super=1 时直接返回 `["*"]` 表示拥有所有权限。这是递归展开权限时的短路优化——不需要再去查每条具体的权限记录。 |
### 填空题答案
| 题号 | 答案 | 解析 |
|------|------|------|
| F1 | `user_roles`;`role_permissions` | user_roles 是多对中间表(user_id + role_id 联合主键);role_permissions 也是联合主键。没有这两个表用户和权限之间的传递关联就无法建立。 |
| F2 | `Redis`;`2h` | 登录时将完整权限树写入 Redis(TTL=2h),之后每次鉴权 O(1) 读取。权限变更时主动删除对应缓存实现最终一致。不查库是关键性能优化。 |
| F3 | `审计` | 强合规系统必须完整记录所有权限相关操作(谁在什么时候获得了什么权限),审计日志不可篡改且长期保存,用于第三方合规审查。 |
### 简答题参考答案
S1:**参考答案要点**:
1. **角色与权限码设计**:定义三个角色 Admin/Edit/Ops。权限码采用 `{resource}:{action}` 格式,如 `product:read`、`product:update`、`product:delete`、`purchase:create`、`purchase:approve`。Admin 获得 product 全量权限,Edit 只有 update,Ops 只有 read。
2. **互斥约束**:在 conflict_roles 表中插入 `(purchase_role_id, approve_role_id)` 一条互斥规则。用户在分配角色时先查询冲突表,如果已持有其中一个就不能分配另一个。
3. **鉴权流程**:登录时查五表获取用户全部权限码(含角色继承展开),写入 Redis(TTL=2h)。后续请求通过 HTTP Middleware 从 Redis 读取做 O(1) 比对。权限变更时主动删除 Redis 缓存。
4. **异常处理**:SoD 冲突检测失败时返回明确错误信息告知用户哪两个角色互斥。Redis 宕机时 fallback 到查库但不作为常规路径。
**评分标准**:答出任意 2 个要点即可得满分;完全正确需覆盖全部要点。
## 关联笔记
- [[OAuth2 与 JWT]]