iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Modern Web

Angular 進階實務 30天系列 第 19

Day 19:權限管理設計思維

  • 分享至 

  • xImage
  •  

前言

在前幾篇,我們談了路由跟狀態管理,有了這些概念之後,就能處理下一個問題:

👉 誰,能對什麼資料,做什麼操作?


權限管理的三個核心問題

  1. Who (誰):使用者、角色、群組。
  2. What (能做什麼):可存取的資源、可執行的操作。
  3. When/Where (在什麼情境下):條件、情境(時間、狀態、資料屬性)。

從粗到細的三個層次

業界常見的二分法是「RBAC = 粗、ABAC = 細」,但實務上我們更常遇到三個層次:

  • 粗粒度 (RBAC):角色導向,快速分權。
  • 中粒度 (Resource-Based):功能 / API 導向,針對資源細分。
  • 細粒度 (ABAC/PBAC):屬性 / 策略導向,依使用者與資料屬性判斷。

權限層次 × 模式

權限層次 常見模式 前端應用 (Angular 17 + ng-zorro) 後端備註 原理說明
粗粒度 (角色導向) RBAC - 依角色顯示或隱藏功能- Router 守衛判斷角色 後端仍需驗證角色 基於角色,設計簡單,彈性不足
中粒度 (資源導向) Resource-Based(常見實作為 RBAC + Resource-Based) - 功能點 / API 權限檢查- Router 模組級守衛 後端需比對資源與操作 基於資源/操作,比 RBAC 更細
細粒度 (屬性/規則導向) ABAC / PBAC - 按鈕依資料屬性動態判斷- Table 行級限制 後端需檢查屬性 / 資料條件 基於「使用者 × 資料 × 環境」條件,最精細

實作案例

1. 粗粒度:角色導向 (RBAC)

前端:Angular Router 守衛

canActivate(): boolean {
  return this.auth.hasRole('Admin');
}

前端:UI 控制 (ng-zorro 按鈕)

<button nz-button *ngIf="auth.hasRole('Admin')">管理後台</button>

2. 中粒度:資源導向 (Resource-Based)

常見上是 RBAC + Resource-Based 實作

前端:功能按鈕權限檢查

<button nz-button *ngIf="auth.hasPermission('order.edit')">編輯訂單</button>

Router:模組級守衛

{ 
  path: 'orders', 
  component: OrdersComponent, 
  canActivate: [PermissionGuard], 
  data: { requiredPermission: 'order.view' }
}

3. 細粒度:屬性/規則導向 (ABAC / PBAC)

前端:按鈕依資料屬性動態判斷

<button nz-button [disabled]="!auth.canEdit(order)">編輯</button>
canEdit(order: Order): boolean {
  return order.ownerId === this.auth.currentUser.id;
}

Table:Row 層級控制


<tr *ngFor="let order of orders" 
    [class.disabled]="!auth.canView(order)">
  <td>{{ order.id }}</td>
  <td>{{ order.owner }}</td>
</tr>

設計思維與建議

  • 先粗後細:從 RBAC 起步,快速建立角色邊界。
  • 資源導向補強:逐步加上功能點與 API 的控制。
  • 屬性導向深化:需要嚴格隔離資料時(金融、醫療)導入 ABAC/PBAC。
  • 前後端雙層防護:前端避免誤操作,後端確保不可繞過。
  • 策略集中化:避免規則散落,建議集中管理(JSON/YAML/Policy Engine)。

小結

  • 權限管理的本質:回答「誰,能對什麼資源,在什麼情境下,做什麼操作?」
  • 從粗粒度 (RBAC) → 中粒度 (Resource-Based) → 細粒度 (ABAC/PBAC),是系統設計思維的演進。
  • Angular 前端可透過 *ngIf、CanActivate、Table 控制;後端則需搭配 Middleware、API 權限表、DB 的 Row-Level Security。

👉 權限管理不只是安全議題,更是架構可維護性的關鍵。


上一篇
Day 18:狀態管理 - 狀態變更(State Changes) → 資料怎麼被修改?
下一篇
Day20:實戰篇 – Angular Directive 實作權限控制
系列文
Angular 進階實務 30天20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言