侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

框架(架构)  /  管理员 发布于 7年前   167

一.权限简介

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

答:生活中的权限限制,① 看灾难片电影《2012》中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临;② 潘棵牵忻挥邢牍裁茨切┏さ闷辽聿暮玫墓媚镌谀闵肀卟淮嬖谀兀恳蛭星撕推凉媚锒际钦涔笙∮械模∮械娜嗽谝黄鹜嫠:徒馑髦肿耸啤6悖奕ㄓ涤兴牵荒茏约和孀约毫恕

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

  • 普通员工
  • 部门主管
  • 总监
  • 总裁

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

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 modelsclass 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.titleclass 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.titleclass 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 modelsclass 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.titleclass 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.titleclass 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 modelsclass Menu(models.Model):  """  菜单  """  title = models.CharField(verbose_name='菜单', max_length=32)  icon = models.CharField(verbose_name='图标', max_length=32)  def __str__(self):    return self.titleclass 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.titleclass 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.titleclass 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 modelsclass Menu(models.Model):  """  菜单  """  title = models.CharField(verbose_name='菜单', max_length=32)  icon = models.CharField(verbose_name='图标', max_length=32)  def __str__(self):    return self.titleclass 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.titleclass 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.titleclass 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    django组合搜索实现过程详解(附代码)
    下一条:
    浅谈django2.0 ForeignKey参数的变化
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客