首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

RBAC 角色權限模型設計完整指南

     編輯:PHP 相關知識

RBAC 角色權限模型設計完整指南

RBAC (Role-Based Access Control) 是企業級應用權限控制的標準模型。本文從核心概念、資料庫設計、關聯關係、存儲過程實作到 .NET WebService/Remoting 整合,提供完整落地方案。

核心設計哲學

用戶 ↔ 角色 ↔ 權限 三層解耦:

  • 用戶:純粹的身份實體,不直接擁有權限
  • 角色:權限的載體,對應業務職責 (如「系統管理員」、「審核員」)
  • 權限:最細粒度的操作授權 (如「用戶新增」、「報表導出」)

優勢:用戶異動只需調整角色關聯,權限變更只需調整角色權限,業務邏輯零修改。

實體屬性定義

1. 用戶

  • UserID (PK)
  • UserName (Unique)
  • UserPwd (加密存儲)
  • Remark

2. 角色

  • RoleID (PK)
  • RoleName (Unique)
  • RoleNote

3. 權限

  • PermissionID (PK)
  • PermissionName (Unique)
  • PermissionNote

關聯關係設計

用戶-角色 (多對多)

CREATE TABLE User_Role (
    UserRoleID  VARCHAR(20) PK,
    UserID      VARCHAR(20) FK,
    RoleID      VARCHAR(20) FK,
    UserRoleNote VARCHAR(200)
);

-- 範例資料
INSERT INTO User_Role VALUES
('1', '1', '01', '用戶「張三」分配角色「系統管理員」'),
('2', '2', '02', '用戶「李四」分配角色「監控人員」'),
('3', '2', '03', '用戶「李四」分配角色「調度人員」');

一個用戶可屬多角色,一個角色可含多用戶。

角色-權限 (多對多)

CREATE TABLE Role_Permission (
    RolePermissionID  VARCHAR(20) PK,
    RoleID            VARCHAR(20) FK,
    PermissionID      VARCHAR(20) FK,
    RolePermissionNote VARCHAR(200)
);

-- 範例:系統管理員擁有完整權限
INSERT INTO Role_Permission VALUES
('1', '01', '0001', '角色「系統管理員」擁有「新增監控」'),
('2', '01', '0002', '角色「系統管理員」擁有「修改監控」'),
('3', '01', '0003', '角色「系統管理員」擁有「刪除監控」'),
('4', '01', '0004', '角色「系統管理員」擁有「查看監控」');

-- 監控人員僅有部分權限
INSERT INTO Role_Permission VALUES
('5', '02', '0001', '角色「監控人員」擁有「新增監控」'),
('6', '02', '0004', '角色「監控人員」擁有「查看監控」');

完整資料庫結構 (5 表)

-- 1. 用戶表
CREATE TABLE Static_User (
    UserID      VARCHAR(20) PRIMARY KEY,
    UserName    VARCHAR(20) NOT NULL UNIQUE,
    UserPwd     VARCHAR(200) NOT NULL,  -- 儲存雜湊值
    LastSignTime DATETIME,
    SignState   INT DEFAULT 0,          -- 0=離線, 1=在線
    TicketID    VARCHAR(128)            -- 單點登入票據
);

-- 2. 角色表
CREATE TABLE Static_Role (
    RoleID   VARCHAR(20) PRIMARY KEY,
    RoleName VARCHAR(20) NOT NULL UNIQUE,
    RoleNote VARCHAR(200)
);

-- 3. 用戶-角色關聯表
CREATE TABLE Static_User_Role (
    UserRoleID   VARCHAR(20) PRIMARY KEY,
    UserID       VARCHAR(20) NOT NULL,
    RoleID       VARCHAR(20) NOT NULL,
    UserRoleNote VARCHAR(200),
    FOREIGN KEY (UserID) REFERENCES Static_User(UserID),
    FOREIGN KEY (RoleID) REFERENCES Static_Role(RoleID)
);

-- 4. 權限表
CREATE TABLE Static_Permission (
    PermissionID   VARCHAR(20) PRIMARY KEY,
    PermissionName VARCHAR(20) NOT NULL UNIQUE,
    PermissionNote VARCHAR(200)
);

-- 5. 角色-權限關聯表
CREATE TABLE Static_Role_Permission (
    RolePermissionID   VARCHAR(20) PRIMARY KEY,
    RoleID             VARCHAR(20) NOT NULL,
    PermissionID       VARCHAR(20) NOT NULL,
    RolePermissionNote VARCHAR(200),
    FOREIGN KEY (RoleID) REFERENCES Static_Role(RoleID),
    FOREIGN KEY (PermissionID) REFERENCES Static_Permission(PermissionID)
);

核心存儲過程設計

權限建立 (開發階段)

CREATE PROCEDURE CreatePermissionInfo
    @PermissionName VARCHAR(20),
    @PermissionNote VARCHAR(200)
AS
    INSERT INTO Static_Permission (PermissionID, PermissionName, PermissionNote)
    VALUES (NEWID(), @PermissionName, @PermissionNote);

用戶管理 (管理員)

CREATE PROCEDURE CreateUserInfo @UserName VARCHAR(20), @UserPwd VARCHAR(200);
CREATE PROCEDURE ModifyUserInfo @UserID VARCHAR(20), @UserPwd VARCHAR(200);
CREATE PROCEDURE DeleteUserInfo @UserID VARCHAR(20);

角色管理 (管理員)

CREATE PROCEDURE CreateRoleInfo @RoleName VARCHAR(20), @RoleNote VARCHAR(200);
CREATE PROCEDURE DeleteRoleInfo @RoleID VARCHAR(20);

授權關聯管理 (管理員)

-- 用戶-角色
CREATE PROCEDURE GrantUserRole @UserID VARCHAR(20), @RoleID VARCHAR(20), @Note VARCHAR(200);
CREATE PROCEDURE DeleteUserRole @UserRoleID VARCHAR(20);

-- 角色-權限
CREATE PROCEDURE GrantRolePermission @RoleID VARCHAR(20), @PermissionID VARCHAR(20), @Note VARCHAR(200);
CREATE PROCEDURE DeleteRolePermission @RolePermissionID VARCHAR(20);

認證與授權核心

.NET Remoting + CallContext 傳遞票據

// 客戶端:將票據放入 CallContext
CallContext.SetData("TicketID", userTicket);

// 遠端方法中取得
var ticket = CallContext.GetData("TicketID") as string;
if (string.IsNullOrEmpty(ticket) || !CheckPermission(ticket, methodName))
    throw new SecurityException("Unauthorized");

關鍵點:實作 ILogicalThreadAffinative 介面的物件才能跨 AppDomain 傳遞。

客戶端類別設計

// 權限管理
class PermissionInfoMng { CreatePermissionInfo(); }

// 用戶管理
class UserInfoMng { CreateUserInfo(); ModifyUserInfo(); DeleteUserInfo(); }

// 角色管理
class RoleInfoMng { CreateRoleInfo(); DeleteRoleInfo(); }

// 用戶-角色授權
class UserRoleMng { GrantUserRole(); DeleteUserRole(); }

// 角色-權限授權
class RolePermissionMng { GrantRolePermission(); DeleteRolePermission(); }

// 認證管理
class Authentication { 
    Login(userName, pwd) → ticket; 
    Logout(); 
    ExceptionLogout(); 
}

進階擴展建議

  1. 資源級權限:權限綁定具體資源實例 (如「僅編輯自己建立的文檔」),引入 ACL 機制
  2. 動態權限:支援時間、IP、裝置等上下文條件的權限判斷 (ABAC 趨勢)
  3. 權限繼承:角色之間建立繼承關係,減少重複授權
  4. 審計日誌:所有授權變更、敏感操作記錄不可變日誌
  5. 分散式 Session:TicketID 存入 Redis,支援多節點無狀態驗證

RBAC 模型以「用戶-角色-權限」三層解耦,配合存儲過程封裝業務邏輯,實現了權限管理的標準化、可維護與擴展。落地時建議優先使用成熟框架 (ASP.NET Core Identity、Spring Security、Casbin),專注於業務權限模型的設計而非重複造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved