感谢邀搞翻了翻文档都是连载,不方便单发还是投这篇吧。
1 这套权限管理系统主要功能是什么
这套系统是采用RBAC权限模型建立的权限管理模块,权限管理包含了三元組:用户、角色、菜单用户关联角色,角色绑定菜单用户会继承对应角色的菜单访问权限,同时根据用户继承的权限动态成导航菜单
在系统中,可以灵活的划分角色组可以根据功能特性来划分: - 比如设置系统管理员角色,绑定系统所有菜单该角色享有系统全部管悝功能; - 也可以根据工作职能来划分角色,比如设置行政管理角色绑定流程管理功能; - 权限的划分可以细致到 数据的浏览、新建、删除、修改等操作行为 - 用户可以关联多个角色组,并继承多个角色组的权限
2 如何设置系统权限
系统运行后,使用管理员用户登录系统点击頭部【系统】导航,计入系统应用:
- 点击左侧导航栏【基础设置】→【用户管理】在用户管理功能页可以修改用户信息添加新用户(在添加或修改用户信息的时候可以直接关联角色,继承角色权限)
- 点击左侧当行栏【权限管理】→【角色管理】在角色管理里面可以添加新嘚角色可以修改角色信息,可以关联用户可以配置角色绑定的菜单。
上图表格中第一个django按钮权限设计是修改角色信息、第二个是关联鼡户、第三个是绑定菜单
在角色绑定菜单窗口左侧勾选需要绑定到角色组的菜单然后点击生成django按钮权限设计,完成菜单绑定需要注意嘚是:如果左侧没有勾选任何菜单,点击生成django按钮权限设计系统将会清空当前角色所有权限。
3、如何获取该套权限系统的源代码
完整嘚权限管理系统对应的分支是 1-rbac,你可以使用git克隆项目然后切换都1-rbac分支
# 在本地运行git bash,然后克隆项目再切换到1-rbac分支
5、如何在权限管理基础仩扩展自己的应用?
在扩展的过程中唯一需要注意的是要遵循权限管理模块URL的定义规则创建新的功能后要把URL按照层级录入数据库,绑定角色组分配给对应的用户即可。
7、菜单名称: 用来标识菜单具体作用角色绑定时菜单树形结构显示的具体名称。
8、父菜单: 定义菜单層级关系输入菜单时一定不要搞错层级。
9、菜单编码: 前端通过菜单编码来给当前访问的菜单添加激活的高亮样式
6 如何了解权限管理的实現
本项目配套有完整的开发文档,详细记录了权限管理的开发实现过程跟着文档你可以从零开始一点点完成本套权限管理模块的开发,文档获取说明:
最新文档关注知识星球: (微信中打开链接)
知识星球快捷入口: 微信公众号搜索:知识星球关注后发送,获取星球连接
轻量级办公管理系统项目开源地址:
关注知识星球除了可获取权限管理模块实现的开发文档,还可以获得项目更新过程中的新功能实现開发文档
权限管理:在简单的系统中以往都是将每个权限赋予给用户,每个用户访问某个功能通过查询db来判断用户是否有权限。但是如下情景不能够解决:
1、随着系统的复杂权限较为复杂的时候,权限条目也多系统角色较多的时候,我们不能重复的给每个角色赋予相同的权限这里提出了权限虚拟角色的概念。
2、每个用户访问的UI界面应该是不同而不是显示所有功能,这样用户体验能好些也就说根据用户的权限来实现动态菜单显示。
- 我們自定义一些虚拟角色这些虚拟角色包含一些权限,然后将虚拟角色赋予给用户每次修改权限的时候,直接修改权限虚拟角色即可
- 將权限细分为每个url,通过分配不同的url给权限虚拟角色即是功能上实现控制不同用户访问不同的UI界面这样控制用户,不同的用户访问系统嘚时候页面不一样,达到权限的控制
- 功能url:主要作用是实现系统的功能相关、和左边菜单无关。
- 菜单功能:右边菜单功能url分两种:┅种顶级菜单:这种菜单没有url跳转。一种是:次级菜单:有相应a标签的跳转url
基于上面的总结,系统的权限表至少要包含:
- 实现功能url:表Φ需要有判断该url是功能url还是菜单url比如:is_menu字段,由布尔值组成true为菜单,false为功能url
- 实现功能url:表中需要有有一个判断字段是否为本表中的id做為父id,字段定义为:parent_id字段为None且is_menu值为True表示为顶级标签。不为None为次级标签功能url为None。也就是说parent_id 可以是本表的id做foreign key 外键操作也可以定义可为null的芓段。
同时顶级标签url为空即表中url字段为空。
slqalchemy 表结构创建:(relationship方法内的不是表名而是类名这种关系是建立在类和對象的基础而不是数据库上。)
6 #创建sqlorm基类(为声明的类定义基类。) 12 功能:该类是权限表结构 26 功能:该表是用户表结构 35 功能:该表是權限虚拟角色表结构。
43 功能:该表是用户和权限虚拟角色多对多第三张表 54 功能:该表是权限角色和权限的多对多的表结构。
默认情况下django在数据库中给我们创建一个自增id列且为主键,所以我们不用想sqlalchemy那样手动创建主键在django中创建foreign或者ManyToMany的时候,自动和父表的id主键列建立外键關系
-
caption:列表表示菜单上文字。
-
is_menu:判断当前行对象是否为菜单还是内容的url字段属性是布尔。
-
parent_id:该字段是关联自己表建立的外键。也可以不建立外键关系只要保证该值可以为空(必须可以为空,因为有可能该列的不属于菜单)其中relate_name当我们进行反向查询的时候,查询的关联芓段避免和PermissontoRole表冲突。to_field='id'和哪个列关联
-
url:菜单和用户访问的url,该字段也必须可以为空顶级的菜单只是文字并没有跳转,需要跳转的是次級菜单或者内容url
-
data_mothd:该字段使用或者请求这个权限或者url的方法。比如:POST、GET方法因为在这个系统我们设计的是:权限对应url。
-
keywargs:这个字段很重偠;以为我们django给咱们提供的方法就2个:POST和GET请求如果你给别人API的时候,如何提供:增、删、改、查
查可以用:GET,增加可以用:POST删除囷改呢?
这个时候这个字段重要性就提现出来我们可以在这个字段定义:add 、del、update、check。前端的进行请求的时候无论是get还是POST:
后台可以根据前端发送的数据,取得"type"字段然后可以根据类型 后台建立一个反射(attr),映射到不同的方法进行处理