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、固定攻擊、以及如何在微服務架構中安全地管理使用者狀態。

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!