目录
- 目标
- 模块拆分
- 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/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 ([email protected]) 。