下面是我在公司写的一个自己刚刚开发完的权限管理模块培训文章,共享供大家参考学习。(可能会看着没头没尾哦)
权限管理功能介绍及新开发功能的接入(整合版+前端)
培训目的:
这次培训的最终目的是想让大家在开发了一个新功能后,能够自己对接权限功能,并自己添加菜单权限数据。
注意:现在的版本已经添加了权限控制,如果不新建菜单权限数据,那么你新开发的功能在生产环境是看不到的。
要想自己新建菜单权限数据,首先要了解权限管理这个功能。下面我就为大家介绍一下。
提纲:
1.权限管理基本概念
2.数据库表结构分析
3.新功能对接权限(开发规范)
4.权限管理常见问题
1.权限管理功能的基本概念
基于B/S(Browser/Server,浏览器/服务器)架构的Web程序通过URL切换不同的页面来实现不同的功能。所谓权限指的就是对URL的可访问性,权限控制可以理解 为对网页信息资源访问的控制,这些信息资源本质上是一个个的链接,因此可通过对URL的控制决定用户是否可以访问。Django通过权限管理设计的思路就是基于对URL的访问的控制。
基于RBAC的通用权限管理实现
RBAC(Role-Based Access Control)是指基于角色的权限访问控制,是信息系统应用最广泛的权限控制方式。在RBAC中有3个要素:用户、角色、权限。角色可以理解为权限的集合,信息系统把部分权限组合起来授予角色,用户通过成为角色成员取得相应的权限。在信息管理系统中,系统用户依据它的管理范围与职责被指派相应的角色而取得相应的权限,也可通过去除用户的角色方式回收用户权限,这种方式简化了权限的管理。
2.数据库表结构与表字段分析(基于django框架的权限功能)
一般情况:
权限RBAC权限管理的需求,我们需要创建5个数据库表:角色表、用户表、菜单表、权限表、权限组表。菜单表存放菜单信息;权限表主要存放权限信息。权限组表实现对权限分组管理,一般对同一个数据库表进行操作的权限分为一组。
各表之间的关系:角色表与用户表是多对多关系,角色表与权限表是多对多关系,权限组表与权限表是一对多关系,菜单表与权限组表是一对多关系。
但我们这边比较特殊,是基于django框架的权限功能,所以会用到django框架自带的一些表,所以表结构会有所区别。
数据库表结构关系
数据库表字段分析:
1.rbac_menu菜单表
例如,我这里添加的是《系统管理》,如上图,id为5,parent_id为4
5是系统管理,如下图可知,系统管理的parent_id是4,而4是配置管理,它的parent_id是1,1是自动化运维,而1的parent_id是null,可以知道,自动化运维是一级菜单
一级菜单,parent_id是null
2.auth_permission权限表
注意:表auth_permission的主键是rbac_permission_menus的主键
也就是因为主键的原因,都知道主键有唯一性,所以一个权限数据在数据库中就只能对应一条菜单数据
3.django_content_type应用模型表
这张表是django框架附带的表,用来确定该权限对应的模型。
通过方法的url在代码路由器中找到对应的view方法,再查找view方法使用了哪个model模型,再确定该方法对应的app_label
4.rbac_permission_menus权限-菜单中间表
auth_permission表权限数据建立了,rbac_menu菜单表数据添加了之后,就可以在这个rbac_permission_menus中间表给菜单绑定权限了。
5.auth_group组表
权限的codename命名规则说明:
添加/新增:add_xxx
删除:delete_xxx
查看(list/view):list_xxx/view_xxx
编辑/修改:change_xxx
执行(除CRUD外的其它权限):run_xxx/(其它)
注意:
list_xxx控的是点击左侧菜单页面的跳转(事实左侧菜单是不会用codename字段判断的,但权限数据还是需要的,所以还是统一规范,方便分类管理)
view_xxx控的是列表详情页面
用户和组绑定,组和权限绑定可以直接在页面操作
这种页面操作就不细说了,比较简单
编辑(为组分配权限)
分配(用户分配到组)
特殊设计
菜单的查看权限的设计有点特殊
菜单的查看权限专门使用了一个查看xxx菜单的按钮,如下图所示。
这个按钮没有url和方法,菜单的url和方法还是在菜单上,这个只是一个权限控制的作用。所以菜单查看权限在rbac_permission_menus中间表中绑定的菜单,绑定的是这个《查看xxx菜单》的id
<查看xxx菜单>
真正的菜单
绑定的是<查看xxx菜单>按钮的id
3.对接权限开发规范流程
1.后端:
如果需要添加对应方法的权限控制,那么就在对应新开发的view方法上添加@permissions_check()装饰器进行权限控制
2.前端:
1.模板头部引用base.html,如下图:
2.对于直接写在模板里的按钮的权限控制,直接在模板加权限控制代码,如下图:
3.对于js动态生成的按钮权限控制则需要做两步:先定义好权限编码全局变量,在生成按钮时加上判断。如以下两图:
3.权限数据:
1.在rbac_menu表添加对应菜单数据
2.在auth_permission表添加对应权限数据
3.再在rbac_permission_menus表绑定菜单和权限
4.最终将权限分配到对应的组中,再将组分配到对应的人
举一个实例
添加DevOps菜单
1.添加rbac_menu表菜单数据
2.添加auth_permission表权限数据
3.添加rbac_permission_menus权限-菜单中间表数据,将权限与菜单绑定
4.添加auth_group_permissions权限-组中间表数据,权限与组绑定
4.权限管理常见问题总结
问题一:django_content_type表有什么作用呢,哪里会用到呢?
这张表的作用两个
- 前端通过app_label字段取权限的codename
- admin后管平台取权限的时候,会关联取出该权限对应的model(模型)和app_label(应用)
问题二:权限codename和方法是怎么关联上的?
权限codename是auth_permission表中的一个字段,auth_permission可以通过rbac_permission_menus这个权限-菜单中间表关联rbac_menu菜单表,而菜单表中有url这个字段,这个url可以通过代码中的路由,找到对应的view方法。这样codename就和方法关联上了。