權限管理
登入
Role Based Access Control (RBAC) 建置規劃
2024/09/11 19:32:45
1
1185
Role Based Access Control (RBAC) 規劃
簡介
- 專案開發需要一套權限管理系統,能夠簡化權限配置流程,減少錯誤,並提供更高的擴展性和可管理性。以下將介紹如何設計一個靈活且可擴展的權限管理架構及其實作步驟。
前言
- 隨著系統角色和權限結構的複雜化,設計架構需要考量以下問題:
- 權限管理複雜性: 隨著角色和權限數量的增加,權限管理變得越來越複雜。每新增一個角色或功能,都需要手動更新配置,這使得管理變得繁瑣且易出錯。
- 不一致的訪問控制: 不同用戶可能擁有不同的權限,這可能導致某些用戶無法訪問所需功能,或不應該有權訪問某些敏感功能,從而引發安全問題。
- 難以擴展: 當系統擴展時,原有的權限管理系統可能無法輕易地擴展以滿足新需求。這會限制系統的靈活性和未來的擴展能力。
設計方向
- 為了解決上述問題,我們需要設計一個可擴展且易於管理的權限控制系統。以下是主要的設計方向:
- 基於角色的訪問控制:通過角色來管理用戶的權限,每個角色擁有特定的權限。這樣可以簡化權限配置,並通過角色來集中管理權限。
- 使用群組和角色的關聯:將用戶組織到不同的群組中,並將角色分配給群組。用戶通過所屬群組獲得相應的角色和權限,從而簡化管理流程。
- 清晰的功能與權限映射:定義明確的功能和權限,並將它們與角色和群組關聯。這樣可以確保每個用戶擁有正確的權限,並且訪問控制過程透明且易於維護。
流程說明
資料表結構
- 用戶資料表 (USER):存儲用戶的基本信息
CREATE TABLE USER ( USER_ID INT PRIMARY KEY, USERNAME VARCHAR(50) NOT NULL, PASSWORD VARCHAR(255) NOT NULL );
- 功能表 (
FUNCTION
):存儲功能代碼和行為類型CREATE TABLE FUNCTION ( FUNCTION_ID INT PRIMARY KEY, FUNCTION_CODE VARCHAR(50), ACTION_TYPE CHAR(1) );
- 角色資料表 (
ROLE
):存儲角色信息CREATE TABLE ROLE ( ROLE_ID INT PRIMARY KEY, ROLE_NAME VARCHAR(50) NOT NULL );
- 使用者角色關聯表 (
USER_ROLE
):定義用戶與角色的關聯CREATE TABLE USER_ROLE ( USER_ID INT, ROLE_ID INT, PRIMARY KEY (USER_ID, ROLE_ID) );
- 群組角色關聯表 (
GROUP_ROLE
):定義群組與角色的關聯CREATE TABLE GROUP_ROLE ( GROUP_ID INT, ROLE_ID INT, PRIMARY KEY (GROUP_ID, ROLE_ID) );
- 群組使用者關聯表 (
GROUP_USER
):定義群組與用戶的關聯CREATE TABLE GROUP_USER ( GROUP_ID INT, USER_ID INT, PRIMARY KEY (GROUP_ID, USER_ID) );
- 角色功能關聯表 (
ROLE_FUNCTION
):定義角色與功能的關聯CREATE TABLE ROLE_FUNCTION ( ROLE_ID INT, FUNCTION_ID INT, PRIMARY KEY (ROLE_ID, FUNCTION_ID) );
- 配置角色和權限
- 根據需求將角色分配給群組,並為每個角色配置相應的權限。
- 通過
USER_ROLE
,GROUP_ROLE
和ROLE_FUNCTION
表來管理功能訪問。
測試資料
以下為各個資料表的結構與測試資料:
- 角色 (
ROLE
)ROLE_ID ROLE_NAME 1 Admin 2 User 3 Guest
- 功能 (
FUNCTION
)FUNCTION_ID FUNCTION_CODE ACTION_TYPE 1 ViewDashboard R 2 EditProfile W 3 DeleteUser D
- 群組 (
GROUP
)GROUP_ID GROUP_NAME 1 AdminGroup 2 UserGroup 3 GuestGroup
- 使用者 (
USER
)USER_ID USER_NAME 101 Alice 102 Bob 103 Carol 104 Dave
- 群組與使用者關聯 (
GROUP_USER
)GROUP_ID USER_ID 1 101 2 102 2 103
- 角色與群組關聯 (
GROUP_ROLE
)GROUP_ID ROLE_ID 1 1 2 2 3 3
- 角色與功能關聯 (
ROLE_FUNCTION
)ROLE_ID FUNCTION_ID 1 1 1 2 1 3 2 1 2 2 3 1
- 用戶與角色關聯 (
USER_ROLE
)USER_ID ROLE_ID 101 1 102 2 103 2 104 3
用戶登入權限檢查流程
登入流程測試案例
以下將說明如何透過登入流程來測試這些權限控管設計:
- Admin 登入 (Alice)
- 步驟: 使用 Alice 的帳號 (
USER_ID: 101
) 登入。
- 預期結果:
- Alice 屬於
AdminGroup
,因此她擁有Admin
角色的所有權限(根據GROUP_ROLE
和ROLE_FUNCTION
表設定)。
- 由於 Alice 沒有額外的個人權限,她的權限完全來自群組角色。因此,Alice 可以查看儀表板、編輯個人檔案和刪除用戶。
- Alice 屬於
- 步驟: 使用 Alice 的帳號 (
- User 登入 (Bob)
- 步驟: 使用 Bob 的帳號 (
USER_ID: 102
) 登入。
- 預期結果:
- Bob 屬於
UserGroup
,因此他擁有User
角色的權限(根據GROUP_ROLE
和ROLE_FUNCTION
表設定)。
- 此外,Bob 還有額外的個人角色權限(根據
USER_ROLE
表設定)。因此,Bob 可以查看儀表板、編輯個人檔案和刪除用戶,因為他的個人角色補充了群組角色中沒有的刪除用戶功能。
- Bob 屬於
- 步驟: 使用 Bob 的帳號 (
- Guest 登入 (Carol)
- 步驟: 使用 Carol 的帳號 (
USER_ID: 103
) 登入。
- 預期結果:
- Carol 屬於
UserGroup
,因此她擁有User
角色的權限(根據GROUP_ROLE
和ROLE_FUNCTION
表設定)。
- Carol 的個人角色沒有額外設定,因此她的權限僅基於群組角色。因此,Carol 可以查看儀表板和編輯個人檔案。
- Carol 屬於
- 步驟: 使用 Carol 的帳號 (
- 獨立用戶測試 (Dave)
- 步驟: 使用 Dave 的帳號 (
USER_ID: 104
) 登入。
- 預期結果:
- Dave 不屬於任何群組,但擁有
Guest
角色的權限(根據USER_ROLE
表設定)。
- 因此,Dave 只能查看儀表板,無法進行其他操作,因為他不在任何群組內,且沒有額外的角色權限。
- Dave 不屬於任何群組,但擁有
- 步驟: 使用 Dave 的帳號 (
驗證結果
我們可以依據每個用戶的群組角色和個人角色來檢查他們對不同功能的訪問權限,確保系統能夠正確地控制訪問權限。這些測試結果將幫助驗證我們的權限控管架構是有效且可擴展的。
透過以上測試資料與案例,我們可以確認權限管理系統在角色和功能訪問控制上的有效性,並驗證系統設計的可靠性和靈活性。
補充說明
在我們的權限控管系統中,群組和個人的權限管理如下:
- 群組權限:
- 用戶所屬的群組擁有一組預設的權限,這些權限是通過群組角色與群組功能關聯 (
GROUP_ROLE
和ROLE_FUNCTION
) 來設定的。用戶會自動獲得群組設定的權限。
- 用戶所屬的群組擁有一組預設的權限,這些權限是通過群組角色與群組功能關聯 (
- 個人角色權限:
- 除了群組角色權限,用戶還可以擁有個人角色權限。這些權限是通過用戶與角色關聯表 (
USER_ROLE
) 來設定的,這些個人角色權限會在群組權限基礎上進行擴展。
- 除了群組角色權限,用戶還可以擁有個人角色權限。這些權限是通過用戶與角色關聯表 (
- 權限合併:
- 登錄系統時,系統首先檢查用戶所屬的群組及其對應的角色權限,然後再檢查用戶的個人角色權限。最終,用戶的權限由群組角色權限和個人角色權限合併形成。
- 這種權限管理方式確保用戶能夠獲得群組提供的基本權限,同時享有個人角色設定的額外權限,從而實現靈活且高效的權限控制。
總結
- 通過設計並實施基於角色的訪問控制系統,我們可以簡化權限管理,降低配置和維護的複雜性。
- 這種方法通過角色、群組和功能的清晰映射,提供了一個靈活且高效的權限管理解決方案。
- 該系統不僅能夠應對當前的需求,還具有良好的擴展性,能夠適應未來的變化和需求。
參考來源