【Django项目开发】权限相关的模型设计(五)

news2024/9/21 8:02:39

在这里插入图片描述


文章目录

  • 一、什么是权限
  • 二、RBAC模型
  • 三、权限模型类设计
    • 1、需要设计那些字段
    • 2、特别注意
  • 四、角色模型类设计
    • 1、需要定义的字段有
    • 2、 多对多模型类设计(重点)
  • 五、用户模型类设计(前面已经设计好了)
  • 六、菜单模型类设计(前面已经设计好了)
  • 七、总结:上面4个表的关联关系为:如下
  • 八、django的信号机制
    • 1、什么是信号
    • 2、代码实现
    • 3、要想上面定义的信号机制生效,需要在apps.py中加载信号机制

一、什么是权限

哪些用户可以操作哪些资源就是权限,对整个后台系统进行权限控制,目的是为了避免系统的使用者因为权限控制的缺少而出现操作不当、数据泄露、流程卡住等问题

二、RBAC模型

RBAC意思是基于角色的权限控制,有别于传统模型中的直接把权限赋予账号,增加了"角色"的概念,再将角色赋予账号,提高了账号管理效率,降低了出错的概率.
在这里插入图片描述

权限本身有两个非常重要的要素:资源和操作
什么是操作? 增、删、改、查、还可以是其他操作
什么是资源?在我们的平台的菜单和接口

三、权限模型类设计

1、需要设计那些字段

菜单表和权限表的关系是一对多

1.name:权限名称
2.is_menu:是否为菜单,默认为菜单;如果为否,表示接口
3.method:操作,表示资源有那些操作
3.path:如果是接口,接口的url
4.desc:描述
5.menu:外键关联字段

2、特别注意

只要是choices参数的字段,如果你想要获取对应的key和value,默认获取的值是key
如果需要获取value,可以采用get_字段名_display()
print(permission.method) :获取key
print(permission.get_method_display()) :获取value

class PermissionsModel(BaseModel):
    """
    权限的模型类,包含两个要素,资源(父菜单,接口)和操作
    """
    method_choices = (
        ('POST', '增'),
        ('DELETE', '删'),
        ('PUT', '改'),
        ('PATCH', '改局部'),
        ('GET', '查'),
    )
    name = models.CharField('权限名称', max_length=50)
    is_menu = models.BooleanField('是否为菜单', default=True)  # True就是菜单,False就是接口
    # 操作
    method = models.CharField('操作', max_length=8, blank=True, default='', choices=method_choices)

    path = models.CharField('访问的url地址', max_length=256, blank=True, null=True)
    desc = models.CharField('权限的描述', max_length=512, blank=True, null=True)
    menu = models.ForeignKey('MenuModel', null=True, blank=True, related_name='permissions_list',
                             on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        db_table = 't_permissions'
        verbose_name = '权限表'
        verbose_name_plural = verbose_name
        ordering = ['id']
                             

四、角色模型类设计

1、需要定义的字段有

角色表和权限表的关系是多对多

name:角色名称
permissions:和权限表的关联关系字段

2、 多对多模型类设计(重点)

a.多对多模型类设计的时候,外键字段可以定义在任意一个模型类中
b.多对多采用ManyToManyField
c.多对多模型类中,需要定义db_table字段选项,目的是2个表通过第三张表进行相关联

class RolesModel(BaseModel):
    """
    角色模型
    """
    name = models.CharField('角色名称', unique=True, max_length=50)
    permissions = models.ManyToManyField('PermissionsModel', db_table='t_roles_permissions',
                                         blank=True, verbose_name='角色的权限')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 't_roles'
        verbose_name = '角色表'
        verbose_name_plural = verbose_name
        ordering = ['id']

五、用户模型类设计(前面已经设计好了)

用户表与角色表的关系是多对多

# ERP系统的用户模型类,默认采用django自带的User类
class UserModel(AbstractUser, BaseModel):
    phone = models.CharField(help_text='手机号码',
                             verbose_name='手机号码',
                             max_length=11,
                             unique=True,
                             blank=True,
                             null=True)
    real_name = models.CharField(help_text='真实名字',
                                 verbose_name='真实名字',
                                 max_length=64,
                                 blank=True,
                                 null=True)
    # 用户所有的角色
    roles = models.ManyToManyField('RolesModel', db_table='t_users_roles', blank=True)
    
    class Meta:
        db_table = 't_user'
        verbose_name = '系统用户表'
        verbose_name_plural = verbose_name

    def __str__(self):
        # return self.username+":"+self.real_name
        return self.username

六、菜单模型类设计(前面已经设计好了)

class MenuModel(BaseModel):
    '''功能菜单的模型类'''
    number = models.IntegerField(help_text='排序数字',
                                 verbose_name='排序数字',
                                 blank=True,
                                 null=True)
    url = models.CharField(help_text='菜单访问的url',
                           verbose_name='菜单访问的url',
                           max_length=256,
                           blank=True,
                           null=True)
    name = models.CharField(help_text='菜单名字',
                            verbose_name='菜单名字',
                            unique=True,
                            max_length=50)
    # 不会真正的把数据库中的数据删除,默认为0,如果是1当前记录删除
    delete_flag = models.CharField(help_text='删除标记',
                                   verbose_name='删除标记',
                                   max_length=1,
                                   default='0')  # 0表示没有删除
    parent = models.ForeignKey('self',  #todo self:自己和自己关联
                               blank=True,
                               null=True,
                               related_name='children', #反向关联的属性
                               on_delete=models.CASCADE)    #当删除的时候作级联删除

    class Meta:
        db_table = 't_menu'
        verbose_name = '功能菜单表'
        verbose_name_plural = verbose_name
        ordering = ['number']

    def __str__(self):
        return self.name

七、总结:上面4个表的关联关系为:如下

在这里插入图片描述

八、django的信号机制

1、什么是信号

通俗来说,信号就是通信双方约定的一种信息通知方式,双方通过信号来确定发生了什么事情,然后决定自己应该做什么。

Django 中的信号用于在框架执行操作时解耦。当某些动作发生的时候,系统会根据信号定义的函数执行相应的操作

Django 中的信号主要包含以下三个要素:

发送者(sender):信号的发出方。
信号(signal):发送的信号本身。
接收者(receiver):信号的接收者

通知是信号中最常用的场景,比如当一个用户登录成功后,给该用户发送通知消息,或者在论坛、博客当你更新话题或者动态。就可以使用信号做信息的推送;当你的发布的动态有其他的用户给你评论的时候,也可以使用信号来通知你。

每当新增一个功能菜单的时候,初始化它对应的权限

例如:增加业务管理菜单,自动赋予它增删改查的权限

2、代码实现

import logging
from django.dispatch import receiver
from django.db.models.signals import post_save
from .models import MenuModel, PermissionsModel

logger = logging.getLogger('erp')

methods = {'POST': '新增', 'GET': '查询', 'PUT': '修改', 'DELETE': '删除'}

#函数在创建菜单的时候自动调,不是手动调
@receiver(post_save, sender=MenuModel)
def create_menus_permissions(sender, instance, created, **kwargs):
    """
    sender:发送信号的人(其实就是菜单)
    创建信号监控函数,信号接收者收到之后自动触发。创建菜单资源对应的权限
    """
    if created:
        logger.info('创建菜单资源对应的权限')
        if isinstance(instance, MenuModel):
            if not instance.parent:  # 因为没有父菜单,所以menu就是功能模块菜单对象
                permission = PermissionsModel.objects.create(name=instance.name + '的权限',
                                                             is_menu=True)
                permission.menu = instance
                permission.save()

            else:  # 当前菜单是接口
                for method in methods.keys():
                    permission = PermissionsModel.objects.create(name=f'{instance.name}{methods.get("method")}的权限',
                                                                 is_menu=False, method=method, path=instance.url)
                    permission.menu=instance
                    permission.save()
        else:
            logger.warning('当前对象不是MenuModel类型,所以不需要创建对应的权限数据')

3、要想上面定义的信号机制生效,需要在apps.py中加载信号机制

当前的apps一加载,会自动执行ready函数

from django.apps import AppConfig


class ErpSystemConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'erp_system'

    def ready(self):
        import erp_system.signals

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring注解详解(使用注解的方式完成IOC)

补充:xml配置 最开始(Spring 1.x),Spring都是通过xml配置控制层(controller)--业务逻辑层(service)--dao层--数据源的关系,但是比较复杂 Spring 2.x的时候,随着JDK1.5支持注解的方式,实现了 "xml 注解" 的开…

Vue自定义指令,自定义插件,过滤器,混入,nextTick

自定义指令:自己定义类似指令的技术。V-开关的特殊属性,是一个对象,自己定义其作用。 指令: v-特殊属性 * vue内置指令: v-html v-text v-pre * v-bind v-on v-if v-show v-for …

我的前端学习经历

我最近在开发一个NFT相关的Saas,部分截图如下:这是我一段时间前,朋友圈发的图,现在Saas在页面上有点变化,但懒得再截图了。客观而言,布局还可以,这一套的技术栈是:React TailwindCs…

​无线数据终端DTU的电路防护元器件推荐产品型号

​无线数据终端DTU是专门用于将串行数据转换为IP数据或将IP数据转换为串行数据通过无线通信网络传输的无线终端设备,因此对于它来说ESD静电放电及雷击浪涌的防护显得尤其重要。 DTU已广泛应用于电力、环保、LED信息发布、物流、水文、气象等行业,其硬件…

【人工智能原理自学】方差代价函数:知错

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解一元一次函数感知器:如何描述直觉,一起卷起来叭! 目录…

[oeasy]python0037_字符画艺术_asciiview_自制小动物_imagick_asciiart

牛说(cowsay) 回忆上次内容 我们狂飙了一路 从用shell 直接执行 python程序到用shell 循环执行 python程序 循环体中 把 python的 输出结果 用管道 交给了 figlet 把 figlet的 输出结果 用管道 交给了 cowsay 把 cowsay的 输出结果 用管道 交给了 lolcat 最后 提权 直接运行 s…

课程设计 | 学生成绩管理系统

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

减小 Go 代码编译后的二进制体积

1 基线用例 减小编译后的二进制的体积,能够加快程序的发布和安装过程。接下来呢,我们分别从编译选项和第三方压缩工具两方面来介绍如何有效地减小 Go 语言编译后的体积。 我们采用同一个测试工程来测试不同方式的效果。 使用的测试工程如下&#xff0…

SQL全自动化检查神器

介绍 Yearning MYSQL 是一个SQL语句审核平台。提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间的那一环,功能丰富,代码开源,安装部署容易! 功能介绍 SQL查询查询…

Prometheus配合 alertmanager 使用邮箱报警

部署Prometheus 和 Alertmanager略 安装包部署prometheusGrafananode_exporter_争取不加班!的博客-CSDN博客 prometheus监控报警部署Alertmanager_争取不加班!的博客-CSDN博客 编辑Alertmanager配置文件 vim alertmanager/alertmanager.yml global: res…

MySQL高可用之主备同步:MySQL是如何保证主备一致的

🏆今日学习目标: 🍀MySql是如何保证主备一致的 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入:…

【Java编程进阶】封装继承多态详解

推荐学习专栏:Java 编程进阶之路【从入门到精通】 文章目录 1. 封装2. 继承2.1 继承的语法2.2 子类重写父类的方法2.3 子类隐藏父类的方法2.4 super 关键字2.5 final 关键字2.6 父类子类类型转换3. 多态4. 总结Java 是一门面向对象程序设计语言,其具有封装,继承和多态三大特…

面向对象的特征之三:多态性

文章目录一、理解多态性二、什么是多态性三、多态性的使用——虚拟方法调用四、多态性使用前提五、适用范围六、虚拟方法调用详细介绍多态性是编译期的还是运行期的?举例每日一考七、instanceof关键字的使用引入:关于多态性的讨论向下转型:in…

Linux-7 文本编辑vi/vim

Linux-7 文本编辑vi/vim vim介绍 什么是vim? vi和vim是Linux下的一个文本编辑工具。(可以李姐为Windows的记事本或word文档) 为什么要使用vim? 因为Linux系统一切皆为文件,而我们工作最多的就是修改某个服务的配置&a…

网络安全——投票系统缺陷(靶场实战)

我们需要利用漏洞来把投票信息刷到第一位 我们可以利用 HTTP_X_FORWARDED_FOR 来进行获取伪造 我们再次进行投票的时候,我们抓取数据包的格式 我们采用上述方法进行伪造 增加变量,我们采用多IP攻击 选中247点击send to Intruder 选中247和1点击 add&…

基于Xlinx的时序分析与约束(8)----关于时序路径、时钟悲观度和建立时间/保持时间的一些问题

写在前面 最近研究vivado里的时序分析路径时,发现了3个很有意思的问题。经过一番查找资料后,总算把问题搞明白了,在这里分享给大家。 1、为什么同一条时序路径在报表里的值不一样? 在如下文件建立的工程中: module te…

Window10下配置Maxim SDK

参考网址: 微信(中文):【嵌入式AI开发&Maxim篇一】美信Maxim78000Evaluation Kit AI部署流程初探 GitHub:MaximAI_Documentation/MAX78000_Feather at master MaximIntegratedAI/MaximAI_Documentation 下载地址…

【回答问题】ChatGPT上线了!如何安装python-ipopt?python-ipopt有哪些用法?

如何安装python-ipopt? 要安装 python-ipopt,你需要先安装 Ipopt 库。这个库是用 C 编写的,所以你还需要安装一些 C 编译器。 在 Linux 系统上,你可以使用下面的命令来安装 Ipopt 和相关的依赖项: 复制 sudo apt-g…

excel成本统计:如何进行区域筛选,多条件求和?

最近有位小伙伴被一个计算产品成本的问题难住了,要求是根据配件成本核算出成品的成本。这个问题看上去似乎有点复杂,感觉一下子想不出好的解决办法,实际上,却非常简单,而且仅用常见的求和函数,就能轻松解决…

Mybatis源码分析(四)Mapper文件的解析

目录一 Mapper的使用二 MapperElement的解析三 解析cache-ref节点四 解析Cache节点五 解析ParameterMap节点六 解析ResultMap节点七 解析Sql节点八 处理各个数据库操作语句官网:mybatis – MyBatis 3 | 简介 参考书籍:《通用源码阅读指导书:M…