django的權限角色管理(RBAC)

在 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, timezoneclass 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.pswp.cn/diannao/83054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83054.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83054.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決docker alpine缺少字體的問題 Could not initialize class sun.awt.X11FontManager

制作的springboot項目鏡像,缺少字體報錯Could not initialize class sun.awt.X11FontManager 原因鏡像中缺少字體 解決: 制作鏡像時,添加字體庫,Dockerfile文件 中添加如下內容 注意: jdk版本一定要使用&#xff0…

MQTT 在Spring Boot 中的使用

在 Spring Boot 中使用 MQTT 通常會借助 Spring Integration 項目提供的 MQTT 支持。這使得 MQTT 的集成可以很好地融入 Spring 的消息驅動和企業集成模式。 以下是如何在 Spring Boot 中集成和使用 MQTT 的詳細步驟: 前提條件: MQTT Broker&#xff…

養生:為健康生活注入活力

在快節奏的現代生活中,養生不再是老年人的專屬,而是每個人維持身心健康的必修課。從飲食到運動,從睡眠到心態,全方位的養生方式能幫助我們抵御壓力,擁抱充滿活力的生活。 飲食養生:合理搭配,滋…

Axure設計之內聯框架切換頁面、子頁面間跳轉問題

在Axure中,你可以通過以下步驟實現主頁面中的內聯框架在點擊按鈕時切換頁面內容,從A頁面切換到B頁面。(誤區:子頁面之間切換不要設置“框架中打開鏈接”然后選“父級框架”這個交互) 主框架頁面(左側導航展…

[思維模式-38]:看透事物的關系:什么是事物的關系?事物之間的關系的種類?什么是因果關系?如何通過數學的方式表達因果關系?

一、什么是事物的關系? 事物的關系是指不同事物之間存在的各種聯系和相互作用,它反映了事物之間的相互依存、相互影響、相互制約等特性。以下從不同維度為你詳細闡述: 1、關系的類型 因果關系 定義:一個事件(原因&a…

OJ判題系統第6期之判題邏輯開發——設計思路、實現步驟、代碼實現(策略模式)

在看這期之前,建議先看前五期: Java 原生實現代碼沙箱(OJ判題系統第1期)——設計思路、實現步驟、代碼實現-CSDN博客 Java 原生實現代碼沙箱之Java 程序安全控制(OJ判題系統第2期)——設計思路、實現步驟…

行業趨勢與技術創新:駕馭工業元宇宙與綠色智能制造

引言 制造業發展的新格局:創新勢在必行 當今制造業正經歷深刻變革,面臨著供應鏈波動、個性化需求增長、可持續發展壓力以及技能人才短缺等多重挑戰。在這樣的背景下,技術創新不再是可有可無的選項,而是企業保持競爭力、實現可持…

高效Python開發:uv包管理器全面解析

目錄 uv簡介亮點與 pip、pip-tools、pipx、poetry、pyenv、virtualenv 對比 安裝uv快速開始uv安裝pythonuv運行腳本運行無依賴的腳本運行有依賴的腳本創建帶元數據的 Python 腳本使用 shebang 創建可執行文件使用其他package indexes鎖定依賴提高可復現性指定不同的 Python 版本…

鴻蒙OSUniApp開發富文本編輯器組件#三方框架 #Uniapp

使用UniApp開發富文本編輯器組件 富文本編輯在各類應用中非常常見,無論是內容創作平臺還是社交軟件,都需要提供良好的富文本編輯體驗。本文記錄了我使用UniApp開發一個跨平臺富文本編輯器組件的過程,希望對有類似需求的開發者有所啟發。 背景…

字符串檢索算法:KMP和Trie樹

目錄 1.引言 2.KMP算法 3.Trie樹 3.1.簡介 3.2.Trie樹的應用場景 3.3.復雜度分析 3.4.Trie 樹的優缺點 3.5.示例 1.引言 字符串匹配,給定一個主串 S 和一個模式串 P,判斷 P 是否是 S 的子串,即找到 P 在 S 中第一次出現的位置。暴力匹…

計算機組成原理:I/O

計算機組成:I/O I/O概述I/O系統構成I/O接口I/O端口兩種編址區分I/O數據傳送控制方式程序查詢方式獨占查詢中斷控制方式硬件判優法(向量中斷法)多重中斷嵌套DMA控制方式三種DMA方式DMA操作步驟內部異常和中斷異常和中斷的關系I/O概述 I/O系統構成 一個最基礎I/O系統的構成:CPU…

ssti模板注入學習

ssti模板注入原理 ssti模板注入是一種基于服務器的模板引擎的特性和漏洞產生的一種漏洞,通過將而已代碼注入模板中實現的服務器的攻擊 模板引擎 為什么要有模板引擎 在web開發中,為了使用戶界面與業務數據(內容)分離而產生的&…

NVMe簡介2

共分2部分,這里是第2部分。 NVMe數據結構 NVMe協議中規定每個提交命令的大小為64字節,完成命令大小為16字節,NVMe命令分為Admin和IO兩類,NVMe的數據塊組織方式有PRP和SGL兩種。提交命令的格式如圖5所示。 圖5 提交命令數據格 N…

高壓啟動電路--學習記錄

常見反激的啟動電路 優點:電路設計簡單,價格便宜 缺點:損壞大,輸入寬范圍的時候,為了保證低壓能正常啟動,啟動電阻阻值需要選小,那么高壓時損耗會非常大,設計的不好很容易在高壓時損…

VS打印printf、cout或者Qt的qDebug等傳出的打印信息

在vs中打印printf、cout或者Qt的qDebug等常見的打印信息有時也是必要的,簡單的敘述一下過程: 1、在vs中打開你的解決方案。 2、鼠標移動到你的項目名稱上,點擊鼠標右鍵,再點擊屬性,此刻會此項目的屬性頁。 3、在配置…

蒼穹外賣--新增菜品

1.需求分析和設計 產品原型 業務規則: 菜品名稱必須是唯一的 菜品必須屬于某個分類下,不能單獨存在 新增菜品時可以根據情況選擇菜品的口味 每個菜品必須對應一張圖片 接口設計: 根據類型查詢分類(已完成) 文件上傳 新增菜品 根據類型…

如何高效集成MySQL數據到金蝶云星空

MySQL數據集成到金蝶云星空:SC采購入庫-深圳天一-OK案例分享 在企業信息化建設中,數據的高效流轉和準確對接是實現業務流程自動化的關鍵。本文將聚焦于一個具體的系統對接集成案例——“SC采購入庫-深圳天一-OK”,詳細探討如何通過輕易云數據…

【springcloud學習(dalston.sr1)】使用Feign實現接口調用(八)

該系列項目整體介紹及源代碼請參照前面寫的一篇文章【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一) (一)Feign的理解 前面文章【springcloud學習(dalston.sr1)】服務消費者通過restTemplat…

SpringbBoot nginx代理獲取用戶真實IP

為了演示多級代理場景,我們分配了以下服務器資源: 10.1.9.98:充當客戶端10.0.3.137:一級代理10.0.4.105:二級代理10.0.4.129:三級代理10.0.4.120:服務器端 各級代理配置 以下是各級代理的基本配…

實驗九視圖索引

設計性實驗 1. 創建視圖V_A包括學號,姓名,性別,課程號,課程名、成績; 一個語句把學號103 課程號3-105 的姓名改為陸君茹1,性別為女 ,然后查看學生表的信息變化,再把上述數據改為原…