RBAC权限管理设计
一.权限简介
1. 问:为什么程序需要权限控制?
答:生活中的权限限制,① 看灾难片电影《2012》中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临;② 屌丝们,有没有想过为什么那些长得漂亮身材好的姑娘在你身边不存在呢?因为有钱人和漂亮姑娘都是珍贵稀有的,稀有的人在一起玩耍和解锁各种姿势。而你,无权拥有他们,只能自己玩自己了。
程序开发时的权限控制,对于不同用户使用系统时候就应该有不同的功能,如:
- 普通员工
- 部门主管
- 总监
- 总裁
所以,只要有不同角色的人员来使用系统,那么就肯定需要权限系统。
2. 问:为什么要开发权限组件?
答:假设你今年25岁,从今天开始写代码到80岁,每年写5个项目,那么你的一生就会写275个项目,保守估计其中应该有150+个都需要用到权限控制,为了以后不再重复的写代码,所以就开发一个权限组件以便之后55年的岁月中使用。 亲,不要太较真哦,你觉得程序员能到80岁么,哈哈哈哈哈哈哈
偷偷告诉你:老程序员开发速度快,其中一个原因是经验丰富,另外一个就是他自己保留了很多组件,新系统开发时,只需把组件拼凑起来基本就可以完成。
3. 问:web开发中权限指的是什么?
答:web程序是通过 url 的切换来查看不同的页面(功能),所以权限指的其实就是URL,对url控制就是对权限的控制。
结论:一个人有多少个权限就取决于他有多少个URL的访问权限。
二.权限表结构设计:第一版
问答环节中已得出权限就是URL的结论,那么就可以开始设计表结构了。
- 一个用户可以有多个权限。
- 一个权限可以分配给多个用户。
你设计的表结构大概会是这个样子:
现在,此时此刻是不是觉得自己设计出的表结构棒棒哒!!!
But,无论是是否承认,你还是too young too native,因为老汉腚眼一看就有问题....
问题:假设 “maple”和“ffm” 这俩货都是老板,老板的权限一定是非常多。那么试想,如果给这俩货分配权限时需要在【用户权限关系表中】添加好多条数据。假设再次需要对老板的权限进行修改时,又需要在【用户权限关系表】中找到这俩人所有的数据进行更新,太他妈烦了吧!!! 类似的,如果给其他相同角色的人来分配权限时,必然会非常繁琐。
三.权限表结构设计:第二版
聪明机智的一定在上述的表述中看出了写门道,如果对用户进行角色的划分,然后对角色进行权限的分配,这不就迎刃而解了么。
- 一个人可以有多个角色。
- 一个角色可以有多个人。
- 一个角色可以有多个权限。
- 一个权限可以分配给多个角色。
表结构设计:
这次调整之后,由原来的【基于用户的权限控制】转换成【基于角色的权限控制】,以后再进行分配权限时只需要给指定角色分配一次权限,给众多用户再次分配指定角色即可。
- from django.db import models
- class Permission(models.Model):
- """
- 权限表
- """
- title = models.CharField(verbose_name='标题', max_length=32)
- url = models.CharField(verbose_name='含正则的URL', max_length=128)
- def __str__(self):
- return self.title
- class Role(models.Model):
- """
- 角色
- """
- title = models.CharField(verbose_name='角色名称', max_length=32)
- permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
- def __str__(self):
- return self.title
- class UserInfo(models.Model):
- """
- 用户表
- """
- name = models.CharField(verbose_name='用户名', max_length=32)
- password = models.CharField(verbose_name='密码', max_length=64)
- email = models.CharField(verbose_name='邮箱', max_length=32)
- roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
- def __str__(self):
- return self.name
注意:现在的设计还不是最终版,但之后的设计都是在此版本基础上扩增的,为了让大家能够更好的理解,我们暂且再此基础上继续开发,直到遇到无法满足的情况,再进行整改。
四.客户管理之动态“一级”菜单
- from django.db import models
- class Permission(models.Model):
- """
- 权限表
- """
- title = models.CharField(verbose_name='标题', max_length=32)
- url = models.CharField(verbose_name='含正则的URL', max_length=128)
- icon = models.CharField(verbose_name='图标', max_length=32, null=True, blank=True, help_text='菜单才设置图标')
- is_menu = models.BooleanField(verbose_name='是否是菜单', default=False)
- def __str__(self):
- return self.title
- class Role(models.Model):
- """
- 角色
- """
- title = models.CharField(verbose_name='角色名称', max_length=32)
- permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
- def __str__(self):
- return self.title
- class UserInfo(models.Model):
- """
- 用户表
- """
- name = models.CharField(verbose_name='用户名', max_length=32)
- password = models.CharField(verbose_name='密码', max_length=64)
- email = models.CharField(verbose_name='邮箱', max_length=32)
- roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
- def __str__(self):
- return self.name
五.客户管理之动态“二级”菜单
- from django.db import models
- class Menu(models.Model):
- """
- 菜单
- """
- title = models.CharField(verbose_name='菜单', max_length=32)
- icon = models.CharField(verbose_name='图标', max_length=32)
- def __str__(self):
- return self.title
- class Permission(models.Model):
- """
- 权限表
- """
- title = models.CharField(verbose_name='标题', max_length=32)
- url = models.CharField(verbose_name='含正则的URL', max_length=128)
- menu = models.ForeignKey(verbose_name='菜单', to='Menu', null=True, blank=True, help_text='null表示非菜单')
- def __str__(self):
- return self.title
- class Role(models.Model):
- """
- 角色
- """
- title = models.CharField(verbose_name='角色名称', max_length=32)
- permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
- def __str__(self):
- return self.title
- class UserInfo(models.Model):
- """
- 用户表
- """
- name = models.CharField(verbose_name='用户名', max_length=32)
- password = models.CharField(verbose_name='密码', max_length=64)
- email = models.CharField(verbose_name='邮箱', max_length=32)
- roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
- def __str__(self):
- return self.name
六.客户管理之默认展开非菜单URL
- from django.db import models
- class Menu(models.Model):
- """
- 菜单
- """
- title = models.CharField(verbose_name='菜单', max_length=32)
- icon = models.CharField(verbose_name='图标', max_length=32)
- def __str__(self):
- return self.title
- class Permission(models.Model):
- """
- 权限表
- """
- title = models.CharField(verbose_name='标题', max_length=32)
- url = models.CharField(verbose_name='含正则的URL', max_length=128)
- pid = models.ForeignKey(verbose_name='默认选中权限', to='Permission', related_name='ps', null=True, blank=True,
- help_text="对于无法作为菜单的URL,可以为其选择一个可以作为菜单的权限,那么访问时,则默认选中此权限",
- limit_choices_to={'menu__isnull': False})
- menu = models.ForeignKey(verbose_name='菜单', to='Menu', null=True, blank=True, help_text='null表示非菜单')
- def __str__(self):
- return self.title
- class Role(models.Model):
- """
- 角色
- """
- title = models.CharField(verbose_name='角色名称', max_length=32)
- permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
- def __str__(self):
- return self.title
- class UserInfo(models.Model):
- """
- 用户表
- """
- name = models.CharField(verbose_name='用户名', max_length=32)
- password = models.CharField(verbose_name='密码', max_length=64)
- email = models.CharField(verbose_name='邮箱', max_length=32)
- roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
- def __str__(self):
- return self.name
RBAC权限管理设计的更多相关文章
- RBAC权限管理模型 产品经理 设计
RBAC权限管理模型:基本模型及角色模型解析及举例 | 人人都是产品经理http://www.woshipm.com/pd/440765.html RBAC权限管理 - PainsOnline的专栏 ...
- vue基于d2-admin的RBAC权限管理解决方案
前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...
- PHP中RBAC权限管理
1.RBAC概念和原理 RBAC:全称叫做Role-Based Access Control,中文翻译叫做基于角色的访问控制.其主要的作用是实现项目的权限控制. ...
- SQL Server:OA权限管理设计的实现 下
SQL Server:OA权限管理设计的实现 下 OA系统权限管理设计方案 不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能. 可以对“组”进行权限 ...
- Spring Security实现RBAC权限管理
Spring Security实现RBAC权限管理 一.简介 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security.由于Spr ...
- 基于Spring Security2与 Ext 的权限管理设计与兑现
基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...
- yii2 rbac权限管理学习笔记
下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...
- ThinkPHP中RBAC权限管理的简单应用
RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...
- 基于RBAC权限管理的后台管理系统
在摸爬滚打中渐渐理解了RBAC权限管理是个什么玩意. RBAC的基本概念: **RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构成了访问权限三元 ...
随机推荐
- Mysql学习路线
本文内容: mysql学习路线 首发日期:2018-04-19 由于现在很多都是有api了,很多问题都转接到编程语言上来处理了,所以这篇mysql之路仅仅是作为“了解”之用.不深究mysql. 很多东 ...
- 彻底删除mysql服务(清理注册表)
由于安装某个项目的执行文件,提示要卸载MySQL以便它自身MySQL安装,然后我禁用了MYSQL服务,再把这个文件夹删除后,发现还是提示请卸载MYSQL服务. 解决步骤: 1.以管理员身份运行命令提示 ...
- CSS盒子模型(Box Model)
一.背景 作为CSS的重点,三大模块之一的盒子模型,这部分无论如何也要精通透彻.在任何一个网页当中,都有自己的布局方式,所谓网页布局方式就是如何把网页里面的文字.图片,很好的排版成美工设计的样式,这时 ...
- U盘中的快捷方式解析
很多人都有使用绿色软件的习惯,在这里我简单称其为Portable App 将这些软甲放到U盘中随身携带,便于我们使用更加符合自身习惯的功能软件. 相信习惯将软件放到U盘启动都会碰到一个问题,就是每次打 ...
- FreeFileSync 文件同步软件(windows)
还有个更好的win同步软件,非常推荐使用: https://roov.org/2016/07/allway-sync/ 官方下载地址:https://freefilesync.org/download ...
- SQLServer删除数据列
删除数据列 开发或者生产过程中多建.错误或者重复的数据列需要进行删除操作. 使用SSMS数据库管理工具删除数据列 方式一 1.打开数据库->选择数据表->展开数据表->展开数据列-& ...
- LeetCode算法题-Longest Univalue Path(Java实现)
这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...
- sqlmap --tamper 绕过WAF脚本分类整理
分类: https://blog.csdn.net/whatday/article/details/54774043 详细介绍: https://blog.csdn.net/qq_34444097/a ...
- vue 对象提供的属性功能、通过axio请求数据(2)
1 Vue对象提供的属性功能 1.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 1.1.1 使用Vue.filter()进行全局定义(全局 ...
- Python开发【第一篇】基础题目二
1 列表题 l1 = [11, 22, 33] l2 = [22, 33, 44] # a. 获取l1 中有,l2中没有的元素 for i in l1: if i not in l2: # b. 获取 ...