本文介绍了 RGCA 四步架构法的思路,通过 RGCA 四步架构法设计一个无代码埋点通用权限管理系统。
目录
RGCA 四步架构法
Requirement:从利益相关者获取需要
Goal:将需要转化为指标(性能用意)
Concept:将指标扩大为残缺概念
Architecture:将概念扩大为架构
从利益相关者获取需要
▌受害准则
好的架构必须使人受害,要想把架构做好,就要专一于性能的涌现,使得零碎把它的次要性能通过逾越零碎边界的接口对外展现进去
▌痛点
对于企业外部的管理系统而言基本上都会有一个权限管理系统,产品经理在进行产品设计的时候须要先确定每一个菜单,每一个按钮的 key 是什么,再将 key 与权限进行匹配、绑定
然而产品经理无奈确定将来所有须要权限治理的中央,所以须要开发人员提前为所有中央设置 key
因为须要设置的 key 有很多,所以可能命名不标准,也有可能会有缺漏,将来波及到脱漏的中央就须要开发人员从新编码、公布能力满足需要,这是开发企业外部权限治理性能的痛点▌利益相关者
• 甲方:开发人员,架构师,投资人
• 客户方:开发人员,产品经理,零碎经营人员,老板
▌需要分类、排序、特色!
将需要转化为指标(性能用意)
从零碎的顶层角度:定义零碎的模式和性能
确定性能用意(性能用意是由次要受益者,次要需要而推导进去的)
模式:通用的权限管理系统
to..by..using
为了 … 通过 … 应用
性能:无需代码埋点,通过 UI 配置扭转资源(页面、按钮、数据、API)的可拜访性,达到权限管制的目标
过程 + 操作 <= 工具
将指标扩大为残缺概念
在指标阶段提出了与解决方案无关的过程:拦挡,一个含糊形象的过程,没有阐明由谁来拦挡,以什么形式来拦挡与解决方案无关的操作对象:受爱护的资源,一个形象的对象,由需要导出了对象的分类,然而依然没有特地具体,没有具体的场景到了概念阶段须要提出具体解决方案过程:从解决方案不相干,到与解决方案相干解决方案是帮忙咱们解决问题的,在指标阶段大抵定义了须要解决什么问题,性能层面只是阐明了产品的劣势具体的解决方案是在概念阶段提出的,它体现出如何把性能进行具体的形容,所以须要推导到到与解决方案相干的局面
受爱护的资源以 API 为例进行推导,定义为 API Action,而拦挡在 ASP .NET Core 中体现为 AuthorizationFilter
因为它是一个名词,不能代表一个过程,所以加上 ing 代表一个过程 AuthorizationFiltering
API Action 通过 AuthorizationFiltering 之后变成一个与解决方案相干的货色
在 ASP .NET Core Mvc 外面变成一个 Result,它是 AuthorizationContext 的一个属性
Result 有几种类型:Sucess,Forbiden,Challenge
受爱护的资源除了 API Action 之外,还能够是 Entity,而所有 EF 的操作最终都放在 DBContext
DBContext 有一个 SaveChanges 的操作,以及一个 ChangeTracker 的属性记录了实体的所有状态
特化:变得更具体
从受爱护的资源到 API Action 就是一个特化的过程,从指标到概念也是一个特化的过程
泛化:变得更形象
从数据、页面、按钮、API 到受爱护的资源就是一个泛化的过程
拦挡的用意:爱护资源
AuthorizationFilter 在 ASP .NET Core 中只能通过在 Action 下面打标签 Authorize 的形式进行拦挡
这就是所谓的代码埋点,比方在 entity 下面打标签也是代码埋点
拦挡的上一层是爱护资源,拦挡是爱护资源的一种形式,须要提前定义受爱护的资源
除了受爱护的资源,对于所有资源须要动静爱护,能够通过动静拦挡的形式
动静拦挡须要实现一个 DynamicAuthorizationFiltering,不能笼罩原有的性能
爱护资源的上一层是平安,平安除了爱护资源,还有很多其余的事件能够做,比方记录日志审计日志会记录用户的所有拜访记录,企业能够设置权限通过这种形式能够不停地将需要往上一层寻找,始终达到最顶层除了向上之外还能够向下寻找,延长出整体概念,通过概念片段的组合,形成残缺的整体概念接下来对拦挡这一过程进行开展,开展为一组必须失去执行的外部过程,针对每一个外部过程,选用特定的操作数、过程及工具对象对其进行特化,就能够失去相应的概念片段,这也是一个特化的过程
• 配置:系统管理员心愿对后盾所有 API 申请进行权限管制,所以首先须要晓得有哪些 API,对每一个 action 须要能够配置
• 赋权:把角色赋权给用户
• 认证:用户认证之后有一个身份
• 受权:基于身份能够进行受权
将概念扩大为架构
▌价值通路与零碎架构
从资源变成权限,权限绑定给用户,用户进行登录,登录之后再进行受权
资源分为 ActionAccess 和 EntityAccess
EntityAccess 有 CanCreate,CanDelete,EntityName,Key 几个属性,以及每个字段是否容许批改 MemberAccess
同理 ActionAccess 有 Url,Name,DisplayName,Verb 几个属性
注册资源分为 Entity Explorer 和 API Explorer
Entity Explorer 通过 DbContext 进行扫描获取须要监听的实体进行注册
API Explorer 通过 IActionDescriptorCollectionProvider 注册 Action
受权有一个拦截器 AuthorizeFilter
ASP .NET Core Identity 有一个基于 Claims 的认证受权机制,它是一个 key:value 的数组
Clamis 属于 User 对象,User 对象属于 HttpContext
AuthorizeFilter 接管 Claims 和 ActionDescriptior,在 Claims 外面能够获取到 Action 的信息,所以两者有关联关系
对于赋权这一步须要定义权限 Permission 和角色,将权限和角色输出到赋权,产生一个角色权限 RolePermission
角色权限 RolePermission 是一个组合对象,蕴含角色与权限
权限和资源之间有一个蕴含关系,一个权限蕴含多个资源
至此实现了一条通路:给多个 Action 定义 key 之后,将 key 赋值给角色,角色绑定到用户,用户登录的时候能够获取到一个 Action 的列表,通过 AuthorizeFilter 来进行比照
受权由 AuthorizationContext 判断是否有权限
响应分为 API 响应 和 Entity 响应,针对不同的响应有不同的解决形式
对于 API 响应须要判断是否容许有权限,未认证返回 401,无权限返回 403
对于 Entity 响应须要 Claims 和 EntityAccessList,通过 Claim 和 AccessList 进行比照
用户登录之后失去 User 身份,发动申请产生 ActionRequest
ActionRequest 属于 HttpContext,最初会输出到 AuthorizeFilter
整个过程从上到下就是这样一个价值通路,并且曾经蕴含了模式对象
从资源到权限,角色,再到角色和用户的绑定,再到受权整个体系,造成了零碎架构
▌层级合成
首先从零碎架构中找到实体对象:资源,权限,角色,用户
资源由 ResourceProvider 提供,分为 ActionResourceProvider 和 EntityResourceProvider
用户和角色应用 ASP .NET Core Identity 的 UserManager 和 RoleManager
ASP .NET Core Identity 只蕴含用户和角色,须要针对 Identity 做扩大,加上权限
UIprotron.Security.Core 负责管理资源和权限
UIprotron.Security.Identity 作为 Identity 的扩大,将资源和权限退出到 Identity 中,相当于一个适配层
UIprotron.Security.ActionAccess 和 UIprotron.Security.EntityAccess 别离负责 Action 和 Entity 的权限
大体上分为以下几局部:
• ASP .NET Core Identity:用户认证的库
• UIprotron.Security.Identity:Core 与 Identity 的集成组件
• UIprotron.Security.Core:对资源和权限的治理
• UIprotron.Security.ActionAccess:Action 资源发现和权限管制
• UIprotron.Security.EntityAccess:Entity 资源发现和权限管制
• UIprotron.Security.Store.EntityFramework:资源和权限的 EF Core 长久层
洋葱架构
• CoreAdapters:最外围最稳固的放最外面
• Application Security.Identity:应用层,Identity 的扩大
• Action Access
• Entity Access
• EfResourceStore
对每一层进行拆分,将性能拆分为 Core,Models,Store 和 EFStore
通过 RGCA 四步架构法从利益相关者获取需要,并将需要转化为指标(性能用意),接着将指标扩大为残缺概念,最初将概念扩大为架构。依照 RGCA 四步架构法的思路,咱们实现了对一个无代码埋点通用权限管理系统的设计,依据架构设计进行代码实现,具体实现能够参考我的项目残缺代码,也能够参考该系列相干文章。
微软最有价值专家(MVP)
微软最有价值专家是微软公司授予第三方技术专业人士的一个寰球奖项。29 年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和教训而取得此奖项。
MVP 是通过严格筛选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的激情并乐于助人的专家。MVP 致力于通过演讲、论坛问答、创立网站、撰写博客、分享视频、开源我的项目、组织会议等形式来帮忙别人,并最大水平地帮忙微软技术社区用户应用 Microsoft 技术。
更多详情请登录官方网站:
https://mvp.microsoft.com/zh-cn
扫码持续发现更多乏味的微软第一方开发者节目!
长按辨认二维码
点击观看开发者节目~