AppBoxFuture(九): 組織結構與權限體系

  權限體系是用於約束用戶訪問或操作資源的權利,這裏的“資源”可以指數據,也可以指特定的功能(如審覈訂單)。通常的權限體系設計是基於角色的訪問控制方式,用戶通過角色與權限進行關聯。作者的實現方式稍微有些不同,通過組織結構樹與權限進行關聯,這樣可以實現子級節點繼承上級節點設置的權限。

一、數據結構

  • 組織單元(OrgUnit):根據上級標識自引用的表結構,另通過EntityRef引用組織或工作組或員工;
  • 權限模型(PermissionModel):框架內置的元數據,包含已賦予權限的組織單元集合。

二、權限設置

  • 開發時根據業務需要,通過IDE主菜單->New->Permission新建權限模型,另可通過New->Folder創建模型文件夾分門別類管理相關模型;
  • 運行時通過OrgUnits視圖(暫簡單實現,如下圖所示)選擇組織單元,然後在“權限設置”面板勾選相應的權限。

注意:請勿將Admin用戶的Admin權限取消掉,未做判斷會導致無權限。

三、權限驗證

內部用戶登錄流程

  • 根據賬號與密碼查詢員工並驗證密碼;
  • 查詢員工映射的組織單元,形成組織單元路徑(如:/公司/部門/員工);
  • 以組織單元路徑新建並緩存會話信息。

注意:系統默認的Admin密碼:760wb,Test密碼:la581

服務內驗證權限

  調用服務時,根據會話的組織單元路徑與指定的權限比對,可判斷當前用戶是否具備特定的權限。

注意:目前未驗證權限的服務所有人均可調用。

  • 服務方法Attribute方式
[InvokePermission(Permissions.Admin || Permissions.Developer)] //可組合
public async Task<EntityList<Entities.OrgUnit>> LoadTreeList()
{
    var q = new TableScan<Entities.OrgUnit>();
    return await q.ToTreeListAsync(t => t.Childs);
}
  • 服務方法內代碼驗證方式
public async Task SaveOrder(Entities.Order order)
{
    if (!Permissions.SaveOrder)
        throw new Exception("不具備操作權限");
    await EntityStore.SaveAsync(order);
}

四、本篇小結

  本篇主要介紹了框架集成的權限體系的實現方式,Github上的運行時已經更新可測試。如果您有問題或Bug報告,請留言或在Github提交Issue。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章