首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 功能權限控制系統:TActionList 統一管理 Action、資料庫驅動啟用/可見屬性、零代碼綁定 UI

     編輯:Delphi

痛點

傳統做法在每個選單、工具列、右鍵選單分別寫 `Enabled := False`,維護惡夢。Delphi 4 引入 TActionList + TAction,**將「功能」抽象為獨立物件**,UI 元件 (Button, MenuItem, ToolButton) 僅透過 `Action` 屬性綁定,一次設定、處處生效。

架構設計

  1. 資料表:
    • Users(UserID PK, UserName, Password)
    • UserRights(UserID, ActionCaption, Enabled, Visible) — 每使用者每功能一筆。
  2. 設計期:在 `TActionList` 編輯器建立所有 `TAction`,設定 `Caption` (對應 `ActionCaption`)、編寫 `OnExecute` 實作業務邏輯。
  3. 執行期啟動:主表單 `OnCreate` 讀取當前使用者權限,遍歷 `ActionList` 套用 `Enabled/Visible`。
  4. 管理介面:用 `TClientDataSet` + `TDBGrid` 直接編輯 `UserRights`,即時生效 (重啟或動態重讀)。

核心代碼

1. 新增使用者時初始化權限


procedure TfrmUser.ActAddExecute(Sender: TObject);
var
  I: Integer;
  Act: TContainedAction;
begin
  // ... 新增 User 記錄 ...
  with frmMain.ActionList1 do
    for I := 0 to ActionCount - 1 do
    begin
      Act := Actions[I];
      cdsUserRights.AppendRecord([cdsUser.FieldByName('UserID').AsString,
                                  Act.Caption, Act.Enabled, Act.Visible]);
    end;
  cdsUserRights.ApplyUpdates(0);
end;

2. 應用程式啟動套用權限


procedure TfrmMain.FormCreate(Sender: TObject);
var
  cds: TClientDataSet;
  I: Integer;
  Act: TContainedAction;
begin
  cds := TClientDataSet.Create(Self);
  try
    cds.LoadFromFile('Rights.cds');
    cds.IndexName := 'UserAction'; // UserID + ActionCaption
    for I := 0 to ActionList1.ActionCount - 1 do
    begin
      Act := ActionList1.Actions[I] as TContainedAction;
      if cds.FindKey([CurrentUserID, Act.Caption]) then
      begin
        Act.Enabled  := cds.FieldByName('Enabled').AsBoolean;
        Act.Visible  := cds.FieldByName('Visible').AsBoolean;
      end;
    end;
  finally
    cds.Free;
  end;
end;

3. UI 元件零代碼綁定

設計時:選取 Button/MenuItem → Object Inspector → `Action` 下拉選擇對應 `TAction`。
執行時:`Action.Enabled := False` 瞬間讓所有綁定的按鈕、選單項變灰/隱藏。

進階擴充

  • 角色基礎存取控制 (RBAC):引入 `Roles`、`RoleRights` 表,使用者屬於多角色,權限取聯集/交集。
  • 動態權限:`Action.OnUpdate` 事件中根據業務狀態 (如記錄狀態、所屬部門) 即時調整 `Enabled`。
  • 審計日誌:`Action.OnExecute` 前記錄 `UserID, ActionCaption, Timestamp`。
  • 跨進程/服務:權限存入資料庫 (SQLite/PostgreSQL),多進程共享;用 `TClientDataSet` 快取減少查詢。

現代化替代

新專案可考慮:
• Spring4D 依賴注入 + 屬性標記權限。
• Casbin (Go/Delphi 移植) 策略引擎 (RBAC/ABAC/ACL)。
• VCL Styles + TActionManager 統一工具列/選單/功能區管理。

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