Django RBAC权限管理设计过程详解

作者:Maple_feng 时间:2021-09-02 03:57:07 

目录
  • 一.权限简介

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

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

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

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

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

一.权限简介

1. 问:为什么程序需要权限控制?

答:生活中的权限限制,① 看灾难片电影《2012》中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临;② * 丝们,有没有想过为什么那些长得漂亮身材好的姑娘在你身边不存在呢?因为有钱人和漂亮姑娘都是珍贵稀有的,稀有的人在一起玩耍和解锁各种姿势。而你,无权拥有他们,只能自己玩自己了。

程序开发时的权限控制,对于不同用户使用系统时候就应该有不同的功能,如:

  • 普通员工

  • 部门主管

  • 总监

  • 总裁

所以,只要有不同角色的人员来使用系统,那么就肯定需要权限系统。

2. 问:为什么要开发权限组件?

答:假设你今年25岁,从今天开始写代码到80岁,每年写5个项目,那么你的一生就会写275个项目,保守估计其中应该有150+个都需要用到权限控制,为了以后不再重复的写代码,所以就开发一个权限组件以便之后55年的岁月中使用。 亲,不要太较真哦,你觉得程序员能到80岁么,哈哈哈哈哈哈哈

偷偷告诉你:老程序员开发速度快,其中一个原因是经验丰富,另外一个就是他自己保留了很多组件,新系统开发时,只需把组件拼凑起来基本就可以完成。

3. 问:web开发中权限指的是什么?

答:web程序是通过 url 的切换来查看不同的页面(功能),所以权限指的其实就是URL,对url控制就是对权限的控制。

结论:一个人有多少个权限就取决于他有多少个URL的访问权限。

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

问答环节中已得出权限就是URL的结论,那么就可以开始设计表结构了。

  • 一个用户可以有多个权限。

  • 一个权限可以分配给多个用户。

你设计的表结构大概会是这个样子:

Django RBAC权限管理设计过程详解

现在,此时此刻是不是觉得自己设计出的表结构棒棒哒!!!

But,无论是是否承认,你还是too young too native,因为老汉腚眼一看就有问题....

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

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

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

  • 一个人可以有多个角色。

  • 一个角色可以有多个人。

  • 一个角色可以有多个权限。

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

表结构设计:

Django RBAC权限管理设计过程详解

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


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

来源:https://www.cnblogs.com/angelyan/p/10631183.html

标签:django,rbac,权限,管理,设计
0
投稿

猜你喜欢

  • SQL Server密码管理的六个危险判断

    2008-10-23 13:57:00
  • 探索网页设计中的黄金比例

    2008-10-20 12:26:00
  • 利用python实现周期财务统计可视化

    2022-03-19 21:30:41
  • ASP生成html的新方法

    2011-04-02 11:04:00
  • 简洁js的隔行变色代码

    2008-06-18 18:17:00
  • 巧妙规划使用Oracle数据空间

    2009-03-20 11:51:00
  • 此数据库没有有效所有者,因此无法安装数据库关系图支持对象

    2012-01-29 18:15:11
  • 解决oracle用户连接失败的解决方法

    2011-01-04 19:35:00
  • 使用ASP脚本命令重新启动服务器

    2008-10-10 11:53:00
  • 不能安装SQL Server 2005的问题及解决方法

    2008-12-26 17:41:00
  • Django app配置多个数据库代码实例

    2023-06-11 09:11:25
  • adox 的vbs类,提取表名,列名等

    2008-07-02 12:37:00
  • 标签明晰、有效

    2010-01-18 12:22:00
  • 用IE浏览器UTF-8页面是一片空白

    2009-06-14 19:55:00
  • asp Driver和Provider两种连接字符串连接Access时的区别

    2011-03-09 11:19:00
  • python Pexpect模块的使用

    2023-01-23 20:54:58
  • python将字典内容写入json文件的实例代码

    2023-08-08 09:14:55
  • PHP的mysqli_select_db()函数讲解

    2023-06-07 18:59:44
  • ASP中Request对象获取客户端数据的顺序

    2007-09-22 10:36:00
  • ASP Framework_1_简介

    2009-10-12 11:35:00
  • asp之家 网络编程 m.aspxhome.com