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

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

1、數據結構

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

2、權限設置

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

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

3、權限驗證

內部用戶登陸流程

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

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

服務內驗證權限

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

注意:目前未驗證權限的服務全部人都可調用。app

  • 服務方法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);
}

4、本篇小結

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

相關文章
相關標籤/搜索