143 lines
6.7 KiB
Markdown
143 lines
6.7 KiB
Markdown
---
|
||
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]]
|