Django 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

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

(0)

相关推荐

  • 使用django-guardian实现django-admin的行级权限控制的方法

    用django框架来做一些后台管理的web页面简直太方便了,django自带模块级的权限系统,用来做一些内部的系统非常合适,可以大大的减少开发量.但是django自带的权限系统还不支持行级的权限控制,如果要实现行级的权限控制,需要依赖第三方的app来开发,或者自己重新写一个. 需求描述 我们项目组开发的一些系统通常会用mysql数据库来存储一些配置,但是如果每次有配置修改的时候都去手动修改mysql数据的话,会挺麻烦的,同时也比较容易出错.django-admin能够根据定义的model自动的生

  • Laravel框架实现的rbac权限管理操作示例

    本文实例讲述了Laravel框架实现的rbac权限管理操作.分享给大家供大家参考,具体如下: 介绍:根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,请自行完善 1.建表(用户表.角色表.权限表.用户角色表.角色权限表) CREATE TABLE IF NOT EXISTS mr_role ( id int(11) PRIMARY KEY AUTO_INCREMENT COMMENT '自增id', name varchar(30) NOT NULL COMMENT

  • 详解Django中的权限和组以及消息

    在认证框架中还有其他的一些功能. 我们会在接下来的几个部分中进一步地了解它们. 权限 权限可以很方便地标识用户和用户组可以执行的操作. 它们被Django的admin管理站点所使用,你也可以在你自己的代码中使用它们. Django的admin站点如下使用权限: 只有设置了 add 权限的用户才能使用添加表单,添加对象的视图. 只有设置了 change 权限的用户才能使用变更列表,变更表格,变更对象的视图. 只有设置了 delete 权限的用户才能删除一个对象. 权限是根据每一个类型的对象而设置的

  • 详解利用 Vue.js 实现前后端分离的RBAC角色权限管理

    项目背景:物业管理后台,不同角色拥有不同权限 采用技术:Vue.js + Vuex + Element UI 实现 RBAC 权限管理需要后端接口支持,这里仅提供前端解决方案. 因代码篇幅较大,对代码进行了删减,文中 "..." 即为省略的一部分代码. 大致思路: 首先登录成功后,从后台拉取用户当前可显示的菜单和可用权限列表,分别将其存入 store 的 nav(菜单导航) 和 auth(用户可用权限) 中,在用户切换路由时,判断是否存在 auth ,如果不存在,则重新获取,判断当前访

  • php 人员权限管理(RBAC)实例(推荐)

    php-人员权限管理(RBAC) 权限管理可以想做vip的功能,普通用户和vip用户的功能是不一样的,大致会用到五张表:用户表.角色表.功能表,还有他们之间互相关联的表:用户与角色表.角色与功能表 我用到的五张表如下: 一. 首先写的是管理员页面 1.用下拉列表显示用户名 <div> <select id="user"> <?php require"../DBDA.class.php"; $db = new DBDA(); $sql =

  • Yii2搭建后台并实现rbac权限控制完整实例教程

    1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际项目中本地的数据库往往跟线上数据库不一致, 我们这里配置到main-local.php就可以了,产品上线后,我们可以使用git或者svn忽略掉main-local.php,线上直接部署. 我们这里使用的mysql数据库,配置如下 当然啦,上面红圈圈的信息需要你自己手动修改掉,要是十分巧合跟我的一样

  • ThinkPHP的RBAC(基于角色权限控制)深入解析

    一.什么是RBAC基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收.角色与角色的关系可以

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

    一.权限简介 1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身材好的姑娘在你身边不存在呢?因为有钱人和漂亮姑娘都是珍贵稀有的,稀有的人在一起玩耍和解锁各种姿势.而你,无权拥有他们,只能自己玩自己了. 程序开发时的权限控制,对于不同用户使用系统时候就应该有不同的功能,如: 普通员工 部门主管 总监 总裁 所以,只要有不同角色的人员来使用系统,那么就肯定需要权

  • Go gin权限验证实现过程详解

    目录 权限管理 1. 特征 2. 怎么运行的 3. 安装 4. 示例代码 权限管理 Casbin是用于Golang项目的功能强大且高效的开源访问控制库. 1. 特征 Casbin的作用: 以经典{subject, object, action}形式或您定义的自定义形式实施策略,同时支持允许和拒绝授权. 处理访问控制模型及其策略的存储. 管理角色用户映射和角色角色映射(RBAC中的角色层次结构). 支持内置的超级用户,例如root或administrator.超级用户可以在没有显式权限的情况下执行

  • Django加载配置的过程详解

    目录 一. Django服务启动 manage.py 二. 引入配置 三. 加载配置 一. Django服务启动 manage.py os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ui.settings") 设置配置文件环境变量- #!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.se

  • 基于 Django 的手机管理系统实现过程详解

    一.概述 打算通过设计数据库,然后结合 Python 框架Django,实现在网页上对数据库的增删改查(本例以手机的管理为例,不考虑订购功能),有普通用户界面和管理员用户界面,普通用户只能做简单的查看需求,管理员用户可以实现对数据库内容的实时修改. 网站主体如下图: 二.设计数据库 根据业务需求,设计数据表,需要下列这些属性: 手机型号.品牌.手机描述.出厂年份.价格.照片.产地. 根据数据表设计原则,数据表设计需要满足基本的函数依赖和范式要求,因此我们将上述属性拆分为四张表格,并建立这些数据表

  • Django models.py应用实现过程详解

    编写 models.py 文件 from django.db import models # Create your models here. class User_info(models.Model): username = models.CharField(max_length=25,verbose_name='用户名') password = models.CharField(max_length=25,verbose_name='密码') age = models.IntegerFiel

  • Django 通过JS实现ajax过程详解

    ajax的优缺点 AJAX使用Javascript技术向服务器发送异步请求 AJAX无须刷新整个页面 因为服务器响应内容不再是整个页面,而是页面中的局部,所以AJAX性能高 小练习:计算两个数的和 方式一:这里没有指定contentType:默认是urlencode的方式发的 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

  • Django 源码WSGI剖析过程详解

    前言 python 作为一种脚本语言, 已经逐渐大量用于 web 后台开发中, 而基于 python 的 web 应用程序框架也越来越多, Bottle, Django, Flask 等等. 在一个 HTTP 请求到达服务器时, 服务器接收并调用 web 应用程序解析请求, 产生响应数据并返回给服务器. 这里涉及了两个方面的东西: 服务器(server)和应用程序(application). 势必要有一个合约要求服务器和应用程序都去遵守, 如此按照此合约开发的无论是服务器还是应用程序都会具有较大

  • django 捕获异常和日志系统过程详解

    这一块的内容很少, 异常使用try except即可, 日志只需要几行配置. 使用装饰器捕获方法内的所有异常 我使用装饰器来整个包裹一个方法, 捕获方法中的所有异常信息.并将其转为json返回客户端. import functools def catch_exception(func, code=500, *args, **kwargs): ''' :param func: :return: ''' @functools.wraps(func, *args, **kwargs) def nefe

  • Django实现跨域请求过程详解

    前言 CORS 即 Cross Origin Resource Sharing 跨域资源共享. 跨域请求分两种:简单请求.复杂请求. 简单请求 简单请求必须满足下述条件. HTTP方法为这三种方法之一:HEAD.GET.POST HTTP头消息不超出以下字段: Accept.Accept-Language.Content-Language.Last-Event-ID 且Content-Type只能为下列类型中的某一个: application/x-www-from-urlencoded mult

  • Python Django 实现简单注册功能过程详解

    项目创建略,可参考Python Django Vue 项目创建. 目录结构如下 编辑views.py from django.shortcuts import render # Create your views here. from django.http import HttpResponse from django.shortcuts import render from common.DBHandle import DataBaseHandle import time def djang

随机推荐