RBAC 與 ABAC
Vibe Prompt
「幫我設計一個 RBAC 系統:有 admin、editor、viewer 三種角色,admin 可以管理全部,editor 可以編輯內容,viewer 只能閱讀。」
RBAC 實作
// 角色定義
const ROLES = {
admin: ['read', 'write', 'delete', 'manage_users'],
editor: ['read', 'write'],
viewer: ['read'],
} as const;
// 權限檢查
function authorize(user, requiredPermission) {
const permissions = ROLES[user.role] || [];
return permissions.includes(requiredPermission);
}
// Express Middleware
function requirePermission(permission) {
return (req, res, next) => {
if (!authorize(req.user, permission)) {
return res.status(403).json({ error: '權限不足' });
}
next();
};
}
app.get('/api/users', requirePermission('manage_users'), (req, res) => {
res.json(users);
});
ABAC(屬性基礎)
// ABAC Policy:使用者只能編輯自己的文章
function canEditArticle(user, article) {
return user.id === article.authorId || user.role === 'admin';
}
// ABAC Policy:只有在上班時間才能刪除
function canDelete(user) {
const hour = new Date().getHours();
return user.role === 'admin' && hour >= 9 && hour <= 18;
}
Supabase RLS(Row Level Security)
-- 使用者只能看自己的訂單
CREATE POLICY "Users can view own orders"
ON orders FOR SELECT
USING (auth.uid() = user_id);
-- Admin 可以看全部
CREATE POLICY "Admins can view all"
ON orders FOR SELECT
USING (auth.jwt() ->> 'role' = 'admin');
關鍵要點
- ✅ 請根據本章主題補充具體的學習重點
- ✅ 建議加入比較表格、程式碼範例或流程圖
- ✅ 確保內容扎實且有價值
RBAC vs ABAC 深入比較
| 比較 | RBAC | ABAC |
|------|:----:|:----:|
| 控制基礎 | 角色(Role) | 屬性(Attribute) |
| 管理複雜度 | 低 | 高 |
| 細粒度 | 中(角色層級) | 高(任意條件) |
| 擴展性 | 角色數量增加時複雜 | 新增屬性較簡單 |
| 典型實作 | if (user.role === "admin") | if (user.department === doc.department && user.level >= doc.level) |
RBAC 實作範例
// Middleware 中的 RBAC 檢查
const ROLES = {
admin: ["create", "read", "update", "delete", "manage_users"],
editor: ["create", "read", "update"],
viewer: ["read"],
} as const;
function authorize(requiredRole: string) {
return (req: Request, res: Response, next: NextFunction) => {
const userRole = req.user?.role;
if (!userRole || !ROLES[userRole]?.includes(requiredPermission)) {
throw new ForbiddenError("權限不足");
}
next();
};
}
// 使用方式
app.delete("/api/users/:id", authorize("admin"), deleteUserHandler);
ABAC 實作範例
// ABAC Policy 引擎
function canAccess(user: User, document: Document): boolean {
// 管理者可以存取所有文件
if (user.role === "admin") return true;
// 文件擁有者可以存取
if (document.ownerId === user.id) return true;
// 同部門可以存取部門文件
if (user.department === document.department &&
document.visibility === "department") return true;
return false;
}
RBAC vs ABAC:怎麼選?
| 比較 | RBAC (Role-Based) | ABAC (Attribute-Based) | |:----:|:--------------------:|:------------------------:| | 控制基礎 | 角色(Role) | 任意屬性(使用者、資源、環境) | | 管理方式 | 將使用者加入角色 | 定義 Policy 規則 | | 細粒度 | 中(角色層級) | 高(任意條件組合) | | 規模化 | 角色數量增加時管理變複雜 | 新增屬性即可擴展 | | 實作複雜度 | 低 | 高 | | 典型場景 | 員工管理系統、後台 | 雲端資源(AWS IAM)、大型 SaaS |
實務建議
先從 RBAC 開始。 90% 的系統只需要 RBAC 就夠了。
當你遇到以下情況時再考慮 ABAC:
- 你的權限規則無法用角色來表達(例如「工程師可以編輯自己部門的文件,但不能編輯財務部的文件」)
- 你的權限規則涉及時間、地點、裝置類型等情境因素
- 你的角色數量已經多到難以管理(超過 50 個角色)
下一章預告:從權限到 Session
RBAC 和 ABAC 回答了「誰可以做什麼」的問題。但使用者是怎麼證明他們是誰的?——這就是 Session Management 的範疇。
下一章將深入 Session 與 JWT 的世界,探討 Session Hijacking、固定攻擊、以及如何在微服務架構中安全地管理使用者狀態。