RBAC vs ABAC vs ReBAC: Choosing the Right Permission System in TypeScript
核心内容
授权是应用中看似简单但随着应用增长会迅速失控的功能。本文深入探讨最常见的授权模型(RBAC、ABAC 和 ReBAC),通过实用的 TypeScript 示例展示每种模型何时出色、何时失效。
关键亮点
1. 授权 vs 认证
- 认证 (Authentication): "你是谁?" - 验证用户身份
- 授权 (Authorization): "你能做什么?" - 决定用户可执行的操作
2. RBAC (Role-Based Access Control)
最简单的模型:用户分配角色,角色拥有权限。
type Role = "admin" | "editor" | "viewer"
const rolePermissions: Record<Role, Permission[]> = {
admin: ["read:articles", "create:articles", "edit:articles", "delete:articles", "manage:users"],
editor: ["read:articles", "create:articles", "edit:articles"],
viewer: ["read:articles"],
}
优点: 简单、易理解、易实现
缺点: 当权限需要考虑上下文(所有权、公司、锁定状态)时变得笨拙
3. ABAC (Attribute-Based Access Control)
基于属性的访问控制:询问用户、资源和环境的属性。
- 主体属性: 用户角色、部门、 clearance level
- 资源属性: 所有者、状态、部门
- 环境属性: 时间、地点
const policies: Policy[] = [
{
name: "Admins can do anything",
evaluate: ({ user }) => user.role === "admin",
},
{
name: "Authors can edit their own documents",
evaluate: ({ user, article }) =>
action === "edit" && article.authorId === user.id && !article.isLocked,
},
]
优点: 策略模块化、可测试、易扩展
缺点: 当授权严重依赖实体间关系时变得复杂
4. ReBAC (Relationship-Based Access Control)
基于关系的访问控制:处理嵌套文件夹、团队层级等复杂关系。
适用场景: Google Drive 文档共享、嵌套资源权限
选择建议
- 简单应用: RBAC 足够
- 需要上下文: 考虑 ABAC
- 复杂关系: ReBAC 或混合方案
实用价值
⭐⭐⭐⭐⭐ 这是一篇权限系统的深度指南,适合后端开发者、安全工程师和需要构建授权系统的全栈工程师。通过实际代码示例清晰展示三种模型的优缺点和适用场景。
探索时间: 2026-03-18 | 来源: Web Dev Simplified