目錄
- 目標
- 模組拆分
- OPM
- 開發任務
目標
基於上一講的模組劃分做一個任務拆解,根據任務拆解實現功能
模組拆分
模組劃分已經完成了邊界的劃分,邊界內外職責清晰
OPM
根據模組拆分畫出 OPM(Object Process Methodology)
ActionAccess 模組中的 ActionResourceProvider 會為 RegisterActions 提供支援
Core 模組會對資源進行掃描,掃描之後會得到大量 ResourceModel,將它們持久化到 IResourceStore
IResourceStore 的實現有 DefaultMemoryStore 和 EFResourceStore
ASP .NET Core 的 ActionRequest 會呼叫 AuthorizeFilter,需要實現一個 DynamicAuthorizeFilter,繼承自 AuthorizeFilter
EntityAccess 模組中的 EntityResourceProvider 會為 RegisterEntities 提供支援
EntityResource 同樣也需要持久化到 IResourceStore
使用者建權需要將 ResourceModel 轉換為 PermissionModel,並持久化到 IPermissionStore
IPermissionStore 有一個 EFPermissionStore 的實現
IPermissionStore 需要輸入給 SavingChanges 操作
定義一個 SecurityInterceptor,繼承自 ISavingChangesInterceptor,提供 SavingChanges
SavingChanges
實體在 DBContext 上執行 SavingChanges 的時候使用者需要進行攔截,判斷使用者是否具有實體增刪改的許可權
首先需要獲取變更實體列表,包括實體的新增、修改、刪除
接著需要獲取實體許可權配置,通過 EntityAccessManager 配置的實體許可權
最後根據是否具有實體相應操作的許可權執行相應的操作
許可權判斷
判斷是否具有實體相應許可權的方式主要是對比 PermissionClaimValue 和 EntityAccessKey
從 EntityAccessList 中的 key 和使用者的 claims 進行對比,如果存在則說明使用者具有相應的許可權
對於實體的欄位 memberAccessList 需要遍歷每一個實體,把所有 member 拿出來和當前修改的屬性名稱對比,判斷是否有修改的許可權
EntityAccessRule 和 MemberAccessRule 是一個一對多的關係
EntityAccessRule 對於表級別的控制有 EntityType,CanCreate,CanDelete 的屬性
MemberAccessRule 對於每一個欄位有 write 的許可權
開發任務
按照模組拆分制定開發任務,可以多人分工協作完成,需要注意模組間是否有依賴,依賴之間的契約是什麼,模組的先後順序,Mock 行為等等
- DotNetNB.Security.Core:定義 core,models,Istore;實現 default memory store
- DotNetNB.Security.ActionAccess:掃描 action;新增 action authorize filter;新增整合方式
- DotNetNB.Security.EntityAccess:掃描 entities;新增 ef savechanges interceptor
- DotNetNB.Security.Store.EntityFramework:基於 mysql 建立 PermissionStore 和 ResourceStore
- DotNetNB.Security.Identity:將許可權賦予角色或使用者;在使用者登入時將 Permissions 寫入使用者身份 claims
課程連結
https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。
如有任何疑問,請與我聯絡 (MingsonZheng@outlook.com) 。