第三章 搭建一个通用的权限管理系统
项目目标部署环境:CentOS 7+
项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx
开源地址:https://github.com/wmowm/nh.core
哈哈,这章其实跟.net core没多大关系,为了后面方便讲解.net core,我们就以这个功能作为切入点,这个功能点也是许多小伙伴期待的内容
权限,通俗的讲,就是系统判定某个用户是否能执行某个操作
我们先模拟一个业务场景:某上市公司,在多个区域控股多个集团,每个集团下又有多个子公司
分析1.这公司好大啊,至少也有千把号人吧,数据加载问题
分析2.职位肯定很多,而且会出现重合,比如子公司A与子公司B,它们的组织结构可能80%是相同的
分析3.单一职责,某个角色,在某个领域下,它只具备某些职能,不然后期就会混乱,到处跨职能
分析4.OOP思想,彼此之间解耦,因为这些操作可能是多人协作的,不可能卡在某个功能点一直等待
分析N.后面就靠园友补充了
这里引用几个基础表,我这里画了原形图,根据原型图进行说明
用户表
录入用户基础信息,每个用户都是一个独立的对象
菜单表
创建一个菜单,权限组是一个配置文件,里面是所有的权限,我们根据菜单勾选它拥有哪些权限即可
角色表
创建一个角色,勾选菜单权限组的一些权限,这里的列表可以做的不用这么复杂,可以单独加一个查看按钮,查看某个角色的所有权限
组织机构表
这里也比较好理解,就是CRUD一个treeview,我们现在还没有职位,所以就不进行职位的操作
职位表
这里CRUD职位表,当职位表有数据时,在组织机构表,可以挂载这些职位
前面介绍的这些表,都是可以独立进行操作的,而且操作也非常简单,我们现在需要把它们关联起来,这里我会结合数据库结构进行讲解
1.组织机构 挂载/移除 职位
这里我们引入一张关系表,机构职位表(OrganizatioPosition)
id oid pid
主键 机构id 职位id
1 1 1
2 1 2
3 2 1
4 2 2
------------------------------------------------------------------------------------
它们的关系 oid 一对一 pid
注意点1.挂载的时候,判断职位是否存在
2.用户授权
展开组织机构,点击职位,会显示两个table,一个用户跟角色,我们在这里为用户授权角色
根据oid 与 pid 可以查询到opid
这里我们引入一张关系表,职位用户角色表(PositionUserRole)
id opid uid rid
主键 机构职位id 用户id 角色id
1 1 1,2,3,4 1,2,3,4
2 2 5,6 1,2,3,4
3 3 11,111 1,2
------------------------------------------------------------------------------------
opid 与 uid 一对多
opid 与 rid 一对多
uid 与 rid 多对多
这里小伙伴可能要问到关于查询的问题,比如想知道 uid=1 拥有哪些角色
用模糊查询 uid like '1,' 或者 uid like ',1,' 这些比较通俗的手法实现
因为我ORM用的是NHibernate,所以查询不用顾虑这些问题,我填充查询器是这样的
in (对象1,对象2)
注意点1.一个用户只能拥有一个职位,如果该职位具有跨部门权限,可以给这个职位添加对应的角色
我们模拟一下登录过程
用户登录 --> 获取用户对象 --> 查询PositionUserRole表,[获取到多个角色,获取到opid] --> 根据opid可以获取到用户的组织机构信息与职位信息
觉得对你有帮助的,可以去给我开源项目点个星星
开源地址:https://github.com/wmowm/nh.core