ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
在前面两篇随笔《ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理》和《ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程》开始介绍了权限管理的内容,其中只是列出了内部的权限系统的审计和登陆信息,以及对Winform界面的整合,本篇随笔继续介绍ABP开发框架的权限控制管理内容,包括用户、角色、机构、权限等方面,以及该框架在Winform方面的应用集成。
1、ABP框架的权限控制管理内容
我们知道,权限管理一般都会涉及到用户、组织机构、角色,以及权限功能等方面的内容,ABP框架的基础内容也是涉及到这几方面的内容,其中它们之间的关系基本上是多对多的关系,它们的关系如下所示。

不过在官网下载的框架里面,包含权限管理这些应用服务层和展示层的内容并不完整,只是简单的包括了用户和角色的基础管理,而且很多权限管理所需要的基础功能并没有提供。
根据ABP框架提供的基础数据库表,我们可以进一步整理权限管理几个重要概念和真实数据库表之间的对应关系,基于这个基础上,我们可以完善整个权限管理模块内容。

上图是ABP基础框架中权限模块里面包含的一些主对象表和中间表,中间表主要用来存储两个对象之间的多对多关系,如角色包含多个用户,用户属于多个机构,机构包含多个角色等等。
2、基于ABP框架的权限管理模块
**1)组织机构管理 **
组织机构主要就是一个层级的对象关系,一般包含但不限于公司、部门、工作组等的定义,其中组织机构包含用户成员和角色成员的关系,如下界面所示。

组织机构包含的成员可以添加多个人员记录,添加界面如下所示。

添加角色界面如下所示。

** 2)角色管理**
角色信息没有层级关系,可以通过列表展示。

其中角色包含权限分配和角色成员的维护,如下是角色编辑界面,包含角色基本信息、权限、成员管理等。

角色的权限包含系统可以用的权限,并可以勾选为角色设置所需的功能点,如下界面所示。

用户成员则和机构的用户管理一样,可以指定多个用户。
3)用户管理
用户管理只需要管理用户基本的信息即可,我们如果需要分配角色可以在角色管理里面统一处理。当然,创建用户的时候,也可以ABP框架的收费版本界面一样,为用户指定角色和机构信息。
我这里主要是维护用户信息即可,用户列表界面如下所示。

用户编辑或者查看界面,除了可以看用户基础信息外,可以查看用户包所属的机构(多个),或者所属的角色(多个)

当然可以查看这个用户本身拥有的权限功能点,如下界面所示。

4)权限功能
严格来说,ABP框架并没有统一管理好权限功能点的,它没有任何表来存储这个功能集合,而是通过派生AuthorizationProvider的子类来定义权限功能点,这种需要通过指定AuthorizationProvider的子类的方式创建功能点,需要每次系统模块增加功能点的时候,编码一下,然后增加自己的功能点,如下界面所示。

这种方式可能能够满足大多数的需要,不过我如果需要增量开发,或者动态增加某些功能点的时候,就有点不方便了。
我在这个基础上引入了一个权限功能的表用来存储功能点的,然后提供管理界面来动态维护这些功能点。如下界面所示。

这样我可以动态添加或者批量添加所需要的功能点,并且和整个权限管理模块串联起来,形成一个完整的控制体系。

这些概念主要还是来源于我的Winform开发框架和混合式开发框架里面的控制思路,以及界面展示的处理。
这样我们就可以管理自己的权限功能点,并可以为指定的角色配置相关的控制功能点,如下表所示是角色的权限集合(系统中间表),也就是给角色分配的功能点,依旧是在原来的系统表里面存储。

3、权限控制在业务模块界面中的使用
我们拥有了用户、角色、机构、权限功能以及它们之间的关系后,我们可以按照一个完善的权限系统来创建对应的用户角色权限关系,并通过在客户端对界面权限的判断和服务端对操作权限的判断,实现完整的控制处理。
服务端由ABP框架内置权限进行管理,通过在AppService里面定义好增删改查等权限点,如引用服务层的基类设置了几个权限点的属性。

我们在子类里面指定这些操作的变量即可,如产品应用服务中,我们可以定义CreatePermissionName为 Product/Add 这样的名称,当然也可以自定义。
然后每次在Action中调用相应的检查即可,如下是对创建的判断检查。

或者更新操作的权限检查

如果对于导入、导出等其他权限,我们则可以通过调用
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">void CheckPermission(string permissionName);</pre>
来进行自己自定义权限名称的判断。
在客户端,我们登录成功后,获取用户的权限集合,然后在客户端进行判断即可进行权限的控制管理,可以控制菜单、按钮等界面元素,如下是整合了权限控制的产品信息管理界面。
分页列表展示界面的控制代码如下所示。

编辑或者查看界面的控制代码如下所示

这样我们 就可以整合了权限到业务管理模块里面,实现对菜单、按钮等元素的权限控制了。
首先在权限管理系统模块里面为用户角色添加对应的产品管理权限点。

产品信息界面展示如下所示。


如果在权限模块的角色里面取消对应的功能点,那么产品管理功能不可用。
