1. 程式人生 > >AppBoxFuture(九): 組織結構與許可權體系

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