一.权限简介

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” 这俩货都是老板,老板的权限一定是非常多。那么试想,如果给这俩货分配权限时需要在【用户权限关系表中】添加好多条数据。假设再次需要对老板的权限进行修改时,又需要在【用户权限关系表】中找到这俩人所有的数据进行更新,太他妈烦了吧!!! 类似的,如果给其他相同角色的人来分配权限时,必然会非常繁琐。

三.权限表结构设计:第二版

聪明机智的一定在上述的表述中看出了写门道,如果对用户进行角色的划分,然后对角色进行权限的分配,这不就迎刃而解了么。

  • 一个人可以有多个角色。
  • 一个角色可以有多个人。
  • 一个角色可以有多个权限。
  • 一个权限可以分配给多个角色。

表结构设计:

这次调整之后,由原来的【基于用户的权限控制】转换成【基于角色的权限控制】,以后再进行分配权限时只需要给指定角色分配一次权限,给众多用户再次分配指定角色即可。

  1. from django.db import models
  2.  
  3. class Permission(models.Model):
  4. """
  5. 权限表
  6. """
  7. title = models.CharField(verbose_name='标题', max_length=32)
  8. url = models.CharField(verbose_name='含正则的URL', max_length=128)
  9.  
  10. def __str__(self):
  11. return self.title
  12.  
  13. class Role(models.Model):
  14. """
  15. 角色
  16. """
  17. title = models.CharField(verbose_name='角色名称', max_length=32)
  18. permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
  19.  
  20. def __str__(self):
  21. return self.title
  22.  
  23. class UserInfo(models.Model):
  24. """
  25. 用户表
  26. """
  27. name = models.CharField(verbose_name='用户名', max_length=32)
  28. password = models.CharField(verbose_name='密码', max_length=64)
  29. email = models.CharField(verbose_name='邮箱', max_length=32)
  30. roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
  31.  
  32. def __str__(self):
  33. return self.name

注意:现在的设计还不是最终版,但之后的设计都是在此版本基础上扩增的,为了让大家能够更好的理解,我们暂且再此基础上继续开发,直到遇到无法满足的情况,再进行整改。

四.客户管理之动态“一级”菜单

  1. from django.db import models
  2.  
  3. class Permission(models.Model):
  4. """
  5. 权限表
  6. """
  7. title = models.CharField(verbose_name='标题', max_length=32)
  8. url = models.CharField(verbose_name='含正则的URL', max_length=128)
  9.  
  10. icon = models.CharField(verbose_name='图标', max_length=32, null=True, blank=True, help_text='菜单才设置图标')
  11. is_menu = models.BooleanField(verbose_name='是否是菜单', default=False)
  12.  
  13. def __str__(self):
  14. return self.title
  15.  
  16. class Role(models.Model):
  17. """
  18. 角色
  19. """
  20. title = models.CharField(verbose_name='角色名称', max_length=32)
  21. permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
  22.  
  23. def __str__(self):
  24. return self.title
  25.  
  26. class UserInfo(models.Model):
  27. """
  28. 用户表
  29. """
  30. name = models.CharField(verbose_name='用户名', max_length=32)
  31. password = models.CharField(verbose_name='密码', max_length=64)
  32. email = models.CharField(verbose_name='邮箱', max_length=32)
  33. roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
  34.  
  35. def __str__(self):
  36. return self.name

五.客户管理之动态“二级”菜单

  1. from django.db import models
  2.  
  3. class Menu(models.Model):
  4. """
  5. 菜单
  6. """
  7. title = models.CharField(verbose_name='菜单', max_length=32)
  8. icon = models.CharField(verbose_name='图标', max_length=32)
  9.  
  10. def __str__(self):
  11. return self.title
  12.  
  13. class Permission(models.Model):
  14. """
  15. 权限表
  16. """
  17. title = models.CharField(verbose_name='标题', max_length=32)
  18. url = models.CharField(verbose_name='含正则的URL', max_length=128)
  19.  
  20. menu = models.ForeignKey(verbose_name='菜单', to='Menu', null=True, blank=True, help_text='null表示非菜单')
  21.  
  22. def __str__(self):
  23. return self.title
  24.  
  25. class Role(models.Model):
  26. """
  27. 角色
  28. """
  29. title = models.CharField(verbose_name='角色名称', max_length=32)
  30. permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
  31.  
  32. def __str__(self):
  33. return self.title
  34.  
  35. class UserInfo(models.Model):
  36. """
  37. 用户表
  38. """
  39. name = models.CharField(verbose_name='用户名', max_length=32)
  40. password = models.CharField(verbose_name='密码', max_length=64)
  41. email = models.CharField(verbose_name='邮箱', max_length=32)
  42. roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
  43.  
  44. def __str__(self):
  45. return self.name

六.客户管理之默认展开非菜单URL

  1. from django.db import models
  2.  
  3. class Menu(models.Model):
  4. """
  5. 菜单
  6. """
  7. title = models.CharField(verbose_name='菜单', max_length=32)
  8. icon = models.CharField(verbose_name='图标', max_length=32)
  9.  
  10. def __str__(self):
  11. return self.title
  12.  
  13. class Permission(models.Model):
  14. """
  15. 权限表
  16. """
  17. title = models.CharField(verbose_name='标题', max_length=32)
  18. url = models.CharField(verbose_name='含正则的URL', max_length=128)
  19.  
  20. pid = models.ForeignKey(verbose_name='默认选中权限', to='Permission', related_name='ps', null=True, blank=True,
  21. help_text="对于无法作为菜单的URL,可以为其选择一个可以作为菜单的权限,那么访问时,则默认选中此权限",
  22. limit_choices_to={'menu__isnull': False})
  23.  
  24. menu = models.ForeignKey(verbose_name='菜单', to='Menu', null=True, blank=True, help_text='null表示非菜单')
  25.  
  26. def __str__(self):
  27. return self.title
  28.  
  29. class Role(models.Model):
  30. """
  31. 角色
  32. """
  33. title = models.CharField(verbose_name='角色名称', max_length=32)
  34. permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)
  35.  
  36. def __str__(self):
  37. return self.title
  38.  
  39. class UserInfo(models.Model):
  40. """
  41. 用户表
  42. """
  43. name = models.CharField(verbose_name='用户名', max_length=32)
  44. password = models.CharField(verbose_name='密码', max_length=64)
  45. email = models.CharField(verbose_name='邮箱', max_length=32)
  46. roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)
  47.  
  48. def __str__(self):
  49. return self.name

RBAC权限管理设计的更多相关文章

  1. RBAC权限管理模型 产品经理 设计

    RBAC权限管理模型:基本模型及角色模型解析及举例 | 人人都是产品经理http://www.woshipm.com/pd/440765.html RBAC权限管理 - PainsOnline的专栏 ...

  2. vue基于d2-admin的RBAC权限管理解决方案

    前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...

  3. PHP中RBAC权限管理

    1.RBAC概念和原理          RBAC:全称叫做Role-Based Access Control,中文翻译叫做基于角色的访问控制.其主要的作用是实现项目的权限控制.            ...

  4. SQL Server:OA权限管理设计的实现 下

    SQL Server:OA权限管理设计的实现 下   OA系统权限管理设计方案     不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能.     可以对“组”进行权限 ...

  5. Spring Security实现RBAC权限管理

    Spring Security实现RBAC权限管理 一.简介 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security.由于Spr ...

  6. 基于Spring Security2与 Ext 的权限管理设计与兑现

    基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...

  7. yii2 rbac权限管理学习笔记

    下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...

  8. ThinkPHP中RBAC权限管理的简单应用

    RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...

  9. 基于RBAC权限管理的后台管理系统

    在摸爬滚打中渐渐理解了RBAC权限管理是个什么玩意. RBAC的基本概念: **RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构成了访问权限三元 ...

随机推荐

  1. Mysql学习路线

    本文内容: mysql学习路线 首发日期:2018-04-19 由于现在很多都是有api了,很多问题都转接到编程语言上来处理了,所以这篇mysql之路仅仅是作为“了解”之用.不深究mysql. 很多东 ...

  2. 彻底删除mysql服务(清理注册表)

    由于安装某个项目的执行文件,提示要卸载MySQL以便它自身MySQL安装,然后我禁用了MYSQL服务,再把这个文件夹删除后,发现还是提示请卸载MYSQL服务. 解决步骤: 1.以管理员身份运行命令提示 ...

  3. CSS盒子模型(Box Model)

    一.背景 作为CSS的重点,三大模块之一的盒子模型,这部分无论如何也要精通透彻.在任何一个网页当中,都有自己的布局方式,所谓网页布局方式就是如何把网页里面的文字.图片,很好的排版成美工设计的样式,这时 ...

  4. U盘中的快捷方式解析

    很多人都有使用绿色软件的习惯,在这里我简单称其为Portable App 将这些软甲放到U盘中随身携带,便于我们使用更加符合自身习惯的功能软件. 相信习惯将软件放到U盘启动都会碰到一个问题,就是每次打 ...

  5. FreeFileSync 文件同步软件(windows)

    还有个更好的win同步软件,非常推荐使用: https://roov.org/2016/07/allway-sync/ 官方下载地址:https://freefilesync.org/download ...

  6. SQLServer删除数据列

    删除数据列 开发或者生产过程中多建.错误或者重复的数据列需要进行删除操作. 使用SSMS数据库管理工具删除数据列 方式一 1.打开数据库->选择数据表->展开数据表->展开数据列-& ...

  7. LeetCode算法题-Longest Univalue Path(Java实现)

    这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...

  8. sqlmap --tamper 绕过WAF脚本分类整理

    分类: https://blog.csdn.net/whatday/article/details/54774043 详细介绍: https://blog.csdn.net/qq_34444097/a ...

  9. vue 对象提供的属性功能、通过axio请求数据(2)

    1 Vue对象提供的属性功能 1.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 1.1.1 使用Vue.filter()进行全局定义(全局 ...

  10. Python开发【第一篇】基础题目二

    1 列表题 l1 = [11, 22, 33] l2 = [22, 33, 44] # a. 获取l1 中有,l2中没有的元素 for i in l1: if i not in l2: # b. 获取 ...