django的权限角色管理(RBAC)

news2025/7/16 6:34:03

在 Django 中,UserGroup 和 Permission 是权限系统的核心组件。下面通过代码示例演示它们的 CRUD(创建、读取、更新、删除) 操作:

一、User 模型 CRUD

from django.contrib.auth.models import User

# 创建用户
user = User.objects.create_user(
    username='alice',
    email='alice@example.com',
    password='securepassword'
)

# 读取用户
user = User.objects.get(username='alice')  # 获取单个用户
users = User.objects.all()                # 获取所有用户
active_users = User.objects.filter(is_active=True)  # 过滤查询

# 更新用户
user.email = 'new_email@example.com'
user.is_staff = True
user.save()

# 删除用户
user.delete()

二、Group 模型 CRUD

from django.contrib.auth.models import Group, Permission

# 创建组
group = Group.objects.create(name='编辑组')

# 读取组
group = Group.objects.get(name='编辑组')
groups = Group.objects.all()

# 更新组
group.name = '高级编辑组'
group.save()

# 删除组
group.delete()

# 为组分配权限
permission = Permission.objects.get(codename='add_post')
group.permissions.add(permission)  # 添加单个权限
group.permissions.remove(permission)  # 移除单个权限
group.permissions.clear()  # 清空所有权限

三、Permission 模型 CRUD

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from myapp.models import Article  # 假设 Article 是你的模型

# 创建自定义权限(通常通过模型的 Meta 类定义)
content_type = ContentType.objects.get_for_model(Article)
permission = Permission.objects.create(
    codename='can_publish',
    name='Can publish articles',
    content_type=content_type
)

# 读取权限
permission = Permission.objects.get(codename='can_publish')
permissions = Permission.objects.filter(content_type=content_type)

# 更新权限
permission.name = 'Can publish and unpublish articles'
permission.save()

# 删除权限
permission.delete()

四、关联操作

1. 用户与组的关联

user = User.objects.get(username='alice')
group = Group.objects.get(name='编辑组')

user.groups.add(group)  # 用户加入组
user.groups.remove(group)  # 用户退出组
user.groups.clear()  # 用户退出所有组
user.groups.set([group])  # 用户只属于指定组

2. 用户与权限的直接关联

permission = Permission.objects.get(codename='add_post')
user.user_permissions.add(permission)  # 直接为用户分配权限
user.user_permissions.remove(permission)  # 移除用户权限
user.user_permissions.clear()  # 清空用户所有权限

五、查询示例

1. 获取用户的所有权限
user = User.objects.get(username='alice')
all_permissions = user.get_all_permissions()  # 返回权限字符串集合
2. 检查用户是否有某个权限
if user.has_perm('myapp.add_article'):
    print("用户有权限")
else:
    print("用户无权限")

3. 获取组的所有成员

group = Group.objects.get(name='编辑组')
users_in_group = group.user_set.all()

六、特殊操作

1. 创建超级用户
# 方法 1:命令行创建
python manage.py createsuperuser

# 方法 2:代码创建
User.objects.create_superuser(
    username='admin',
    email='admin@example.com',
    password='adminpassword'
)
2. 修改用户密码
user = User.objects.get(username='alice')
user.set_password('new_secure_password')
user.save()

七  模型关系图 

 

# 权限与角色(组)相关联,用户通过称为适当角色(组)的成员而得到这些角色(组)的权限

# 极大的简化了权限的管理(相互依赖)

# Django的Auth组件(app)采用的认证规则就是RBAC

    1 User表                     :存用户信息
    2 Permission表             :存权限
    3 Role表                     :存角色(组)

    4 Group_Role中间表            :权限赋予角色(多对多)
    5 User_Group中间表            :角色赋予用户(多对多)
    6 User_Permission中间表    :权限临时赋予角色(多对多)
        
'''
ps:
    1 Django后台管理admin自带RBAC
'''
 

八 手动实现一下关联关系


from django import models
from datetime import datetime, timezone


class Permission(models.Model):
    """
        权限表
    """
    name = models.CharField(max_length=255)
    codename = models.CharField(max_length=100)


class Group(models.Model):
    """
        分组表
    """
    name = models.CharField(max_length=150)
    permissions = models.ManyToManyField(
        Permission,
        through='GroupPermission',  # 指定模型
        through_fields=('group', 'permission'),  # 指定字段
        blank=True
    )


class User(models.Model):
    """
        用户表
    """
    username = models.CharField(max_length=150)
    password = models.CharField(max_length=128)
    email = models.EmailField(max_length=254)
    fist_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=150, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(null=True, default=timezone.now)

    groups = models.ManyToManyField(
        Group,
        through='UserGroup',  # 指定模型
        through_fields=('user', 'group'),  # 指定字段
        blank=True
    )
    user_permissions = models.ManyToManyField(
        Permission,
        through='UserPermission',  # 指定模型
        through_fields=('user', 'permission'),  # 指定字段
        blank=True
    )


class UserGroup(models.Model):
    """
        用户和分组关系表
    """
    user_id = models.ForeignKey(User, on_delete=models.CASCADE)
    group_id = models.ForeignKey(Group, on_delete=models.CASCADE)


class UserPermission(models.Model):
    """
        用户和权限关系表
    """
    user_id = models.ForeignKey(User, on_delete=models.CASCADE)
    permission_id = models.ForeignKey(Permission, on_delete=models.CASCADE)

九 自动关联关系


class Permission(models.Model):
    """
        权限表
    """
    name = models.CharField(max_length=255)
    codename = models.CharField(max_length=100)


class Group(models.Model):
    """
        分组表
    """
    name = models.CharField(max_length=150)
    permissions = models.ManyToManyField(Permission, blank=True)


class User(models.Model):
    """
        用户表
    """
    username = models.CharField(max_length=150)
    password = models.CharField(max_length=128)
    email = models.EmailField(max_length=254)
    fist_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=150, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(null=True, default=timezone.now)

    groups = models.ManyToManyField(Group, blank=True)
    user_permissions = models.ManyToManyField(Permission, blank=True)

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

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

相关文章

线性表-顺序表(Sequential List)

1 线性表 1.1 顺序表(Sequential List) 顺序表并不难理解,主要是知道顺序表是在内存中连续存储的一段数据,知道这个后,相应的算法也就非常简单了。 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的…

【阿里云免费领取域名以及ssl证书,通过Nginx反向代理web服务】

文章目录 前言一、申请域名1.1 访问阿里云官网1.2 输入自定义域名1.3 创建个人模板1.4 支付1元可以使用域名1年1.5 按照提示实名认证1.6 实名认证成功 二、域名解析2.1 选择域名解析2.2 解析设置2.3 快速添加解析2.4 选择对应类型2.5 解析成功 三、申请免费ssl证书3.1 访问阿里…

数据分析2

五、文件 CSV Comma-Separated Value,逗号分割值。CSV文件以纯文本形式存储表格数据(数字和文本)。 CSV记录间以某种换行符分隔,每条记录由字段组成,字段间以其他字符或字符串分割,最常用逗号或制表符。…

实战项目5(08)

目录 任务场景一 【r1配置】 【r2配置】 【r3配置】 ​​​​​​​任务场景二 【r1配置】 【r2配置】 ​​​​​​​任务场景一 按照下图完成网络拓扑搭建和配置 任务要求: 通过在路由器R1、R2和R3上配置静态路由,实现网络中各终端PC能够正常…

.NET MAUI 基础知识

文章目录 什么是 .NET MAUI?MAUI的核心特点与Xamarin.Forms的区别 开发环境搭建安装Visual Studio 2022安装必要组件配置Android开发环境配置iOS开发环境验证安装 创建第一个MAUI应用创建新项目MAUI项目结构解析理解关键文件运行应用程序简单修改示例使用热重载 MAU…

佰力博科技与您探讨表面电阻的测试方法及应用领域

表面电阻测试是一种用于测量材料表面电阻值的技术,广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法: 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中,平行电极法通过在试样…

鹅厂面试数学题

题目 一个圆上随机取三个点,求这三个点构成锐角三角形的概率。 解答 根据圆周角定理,此题目等价为:一条线段长度为1的线段随机取两个点分成三段,任意一段长度均不大于1/2的概率。记前两段的长度为,则第三段的长度为…

java基础-package关键字、MVC、import关键字

1.package关键字: (1)为了更好管理类,提供包的概念 (2)声明类或接口所属的包,声明在源文件首行 (3)包,属于标识符,用小写字母表示 &#xff0…

[6-2] 定时器定时中断定时器外部时钟 江协科技学习笔记(41个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 V 30 31 32 33 34 35 36 37 38 39 40 41

【PmHub后端篇】PmHub中基于自定义注解和AOP的服务接口鉴权与内部认证实现

1 引言 在现代软件开发中,尤其是在微服务架构下,服务接口的鉴权和内部认证是保障系统安全的重要环节。本文将详细介绍PmHub中如何利用自定义注解和AOP(面向切面编程)实现服务接口的鉴权和内部认证,所涉及的技术知识点…

多模态AI新纪元:Vertex AI Gemini与Spring AI深度集成实践

企业级AI集成进阶:Spring AI与Vertex AI Gemini的配置与调优实战 一、前沿技术:多模态模型的企业级配置范式 在生成式AI技术快速迭代的当下,企业级应用对模型配置的精细化需求日益增长。Vertex AI Gemini作为Google推出的多模态大模型&…

开源AI数字人分身克隆小程序源码系统深度剖析:从搭建到应用

在人工智能与小程序生态深度融合的当下,开源 AI 数字人分身克隆小程序源码成为开发者的热门工具。从搭建基础环境到实现实际应用,这一过程涉及多项技术与复杂流程。本文将带您深入剖析开源 AI 数字人分身克隆小程序源码,揭开其从搭建到应用的…

ETL背景介绍_1:数据孤岛仓库的介绍

1 ETL介绍 1.1 数据孤岛 随着企业内客户数据大量的涌现,单个数据库已不再足够。为了储存这些数据,公司通常会建立多个业务部门组织的数据库来保存数据。比如,随着数据量的增长,公司通常可能会构建数十个独立运行的业务数据库&am…

Linux系统:虚拟文件系统与文件缓冲区(语言级内核级)

本节重点 初步理解一切皆文件理解文件缓冲区的分类用户级文件缓冲区与内核级文件缓冲区用户级文件缓冲区的刷新机制两级缓冲区的分层协作 一、虚拟文件系统 1.1 理解“一切皆文件” 我们都知道操作系统访问不同的外部设备(显示器、磁盘、键盘、鼠标、网卡&#…

智能体的典型应用:自动驾驶、智能客服、智能制造、游戏AI与数字人技术

本文为《React Agent:从零开始构建 AI 智能体》专栏系列文章。 专栏地址:https://blog.csdn.net/suiyingy/category_12933485.html。项目地址:https://gitee.com/fgai/react-agent(含完整代码示​例与实战源)。完整介绍…

国联股份卫多多与七腾机器人签署战略合作协议

5月13日,七腾机器人有限公司(以下简称“七腾机器人”)市场部总经理孙永刚、销售经理吕娟一行到访国联股份卫多多,同卫多多/纸多多副总裁、产发部总经理段任飞,卫多多机器人产业链总经理郭碧波展开深入交流,…

WebGL 开发的前沿探索:开启 3D 网页的新时代

你是否曾好奇,为何如今网页上能呈现出如同游戏般逼真的 3D 场景?这一切都要归功于 WebGL。它看似神秘,却悄然改变着我们浏览网页的体验。以往,网页内容大多局限于二维平面,可 WebGL 打破了这一限制。它究竟凭借什么&am…

激光雷达定位算法在FPGA中的实现——section3 Matlab实现和校验

1、校验section2的计算方法是否正确 以section1里面的图示 举个例子: 1.1 手动计算

AI+可视化:数据呈现的未来形态

当AI生成的图表开始自动“美化”数据,当动态可视化报告能像人类一样“讲故事”,当你的眼球运动直接决定数据呈现方式——数据可视化的未来形态,正在撕裂传统认知。某车企用AI生成的3D可视化方案,让设计师集体失业;某医…

[免费]微信小程序医院预约挂号管理系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端),分享下哈。 项目视频演示 【免费】微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩…