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

  

一。权限简介
  

  

<强> 1。问:为什么程序需要权限控制?

  

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

  

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

  
      <李>普通员工李   <李>部门主管李   <李>总监李   <李>总裁李   
  

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

  

<强> 2。问:为什么要开发权限组件?

  

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

  

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

  

<强> 3。问:web开发中权限指的是什么?

  

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

  

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

  

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

  

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

  
      <李>一个用户可以有多个权限。   <李>一个权限可以分配给多个用户。   
  

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

  

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

  

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

  

,但无论是是否承认,你还是太年轻太本地,因为老汉腚眼一看就有问题....

  

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

  

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

  

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

  
      <李>一个人可以有多个角色。   <李>一个角色可以有多个人。   <李>一个角色可以有多个权限。   <李>一个权限可以分配给多个角色。   
  

表结构设计:

  

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

  

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

        django。数据库导入模型   类许可(models.Model):   ”“”   权限表   ”“”   title=模型。CharField (verbose_name='标题”,max_length=32)   url=模型。CharField (verbose_name='含正则的URL”, max_length=128)      def __str__(自我):   返回self.title   类角色(models.Model):   ”“”   角色   ”“”   title=模型。CharField (verbose_name='角色名称”,max_length=32)   权限模型。ManyToManyField (verbose_name='拥有的所有权限”,=靶砜伞?空白=True)   def __str__(自我):   返回self.title   类用户信息(models.Model):   ”“”   用户表   ”“”   name=模型。CharField (verbose_name='用户名”,max_length=32)   密码=模型。CharField (verbose_name='密码”,max_length=64)   电子邮件=模型。CharField (verbose_name='邮箱”,max_length=32)   角色模型。ManyToManyField (verbose_name='拥有的所有角色”,=敖巧?空白=True)      def __str__(自我):   返回self.name

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