AppBoxFuture(九): 組織結構與許可權體系
阿新 • • 發佈:2019-06-12
許可權體系是用於約束使用者訪問或操作資源的權利,這裡的“資源”可以指資料,也可以指特定的功能(如稽核訂單)。通常的許可權體系設計是基於角色的訪問控制方式,使用者通過角色與許可權進行關聯。作者的實現方式稍微有些不同,通過組織結構樹與許可權進行關聯,這樣可以實現子級節點繼承上級節點設定的許可權。
一、資料結構
- 組織單元(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