Django 自帶的用戶系統與 RBAC 機制
Django 自帶的用戶系統(django.contrib.auth
)提供了 身份驗證(Authentication) 和 權限管理(Authorization),能夠快速實現 用戶管理、權限控制、管理員后臺 等功能,同時具備 RBAC(基于角色的訪問控制,Role-Based Access Control) 的基本實現。本文將詳細介紹 Django 用戶系統的功能、管理員賬號創建、RBAC 機制及其擴展方案。
一、Django 自帶用戶系統的作用
Django 自帶的用戶系統主要用于 用戶身份管理、身份驗證、權限與授權、用戶管理后臺 以及 擴展性,使開發者能夠快速實現用戶相關功能,而無需從零編寫。
(一)用戶身份管理
Django 提供了默認的 User
模型,其中包含:
- 基本字段:
username
、password
、email
等 - 權限字段:
is_active
(是否激活)、is_staff
(是否是后臺管理員)、is_superuser
(是否是超級用戶) - 用戶創建:
User.objects.create_user()
:創建普通用戶User.objects.create_superuser()
:創建超級管理員
(二)身份驗證(Authentication)
- 密碼存儲:Django 采用 PBKDF2、Argon2、BCrypt 等安全算法存儲密碼
- 登錄與退出:
authenticate()
:驗證用戶名和密碼login()
:記錄用戶 sessionlogout()
:清除用戶 session,注銷登錄
- 自動處理用戶 session:可通過
request.user
直接獲取當前登錄用戶
(三)權限與授權(Permissions & Authorization)
Django 的權限管理體系包含 用戶權限、組權限、對象權限。
- 用戶權限:通過
is_staff
和is_superuser
控制 - 組權限:使用
Group
模型批量管理權限 - 對象權限:支持模型級權限(
add_xxx
、change_xxx
、delete_xxx
) - 權限檢查:
@login_required
限制訪問@permission_required("app_label.permission_name")
控制權限request.user.has_perm("app_label.permission_name")
檢查權限
(四)用戶管理后臺
Django 自帶 admin
后臺(django.contrib.admin
),可快速管理 用戶、權限、組,無需額外開發界面。
(五)擴展性
- 自定義用戶模型:通過
AbstractUser
或AbstractBaseUser
進行擴展 - 擴展用戶字段:如手機號、頭像等
- 第三方認證:可集成 OAuth(Google、GitHub 登錄)或 JWT(DRF Simple JWT)
二、管理員賬號的創建與管理
(一)如何創建管理員賬號?
Django 不會自動創建管理員賬號,需要手動執行以下命令:
python manage.py createsuperuser
隨后輸入 用戶名、郵箱、密碼 創建管理員賬戶。
(二)如何使用管理員賬號登錄?
- 訪問 Django Admin 后臺:
http://127.0.0.1:8000/admin/
- 使用
createsuperuser
創建的賬號登錄。
(三)如何查看或修改管理員賬號?
- 在數據庫中查找超級管理員:
SELECT username, email FROM auth_user WHERE is_superuser=1;
- 修改管理員密碼:
python manage.py changepassword admin
三、Django 的 RBAC(基于角色的訪問控制)機制
Django 自帶 RBAC 的基礎實現,主要通過 用戶(User)、權限(Permission)、組(Group) 進行管理。
(一)用戶(User)
- 每個用戶可以 獨立擁有權限 或 歸屬于某個組(Group),繼承組權限。
(二)權限(Permission)
Django 提供了 基于模型的權限,默認包括:
add_modelname
(添加權限)change_modelname
(修改權限)delete_modelname
(刪除權限)view_modelname
(查看權限)
權限檢查
- 代碼中檢查權限:
if request.user.has_perm('app_label.permission_name'):# 用戶有權限
- 使用裝飾器:
from django.contrib.auth.decorators import permission_required@permission_required('app_label.permission_name', raise_exception=True) def my_view(request):pass
(三)組(Group)
Group
允許批量管理權限,方便將權限分配給多個用戶。例如:
from django.contrib.auth.models import Group, Permission# 創建一個 "編輯" 組
editor_group = Group.objects.create(name='Editor')# 獲取某個權限
permission = Permission.objects.get(codename='change_article')# 給 "編輯" 組添加權限
editor_group.permissions.add(permission)# 將用戶加入 "編輯" 組
user.groups.add(editor_group)
四、Django RBAC 機制的局限性及擴展
Django 默認的 RBAC 較為基礎,存在以下局限:
- 權限是基于模型的,無法控制對象級權限(如用戶只能編輯自己創建的文章)
- 沒有層級角色,管理員無法管理某個組
- 沒有前端 UI,只能通過 Django Admin 或代碼管理
(一)擴展 Django RBAC
1. 自定義權限系統
- 繼承
AbstractUser
或AbstractBaseUser
自定義用戶模型 - 設計
UserRole
表,實現 用戶 → 角色 → 權限 關系
2. 使用 django-guardian
實現對象級權限
django-guardian
允許用戶對特定對象(如某篇文章)賦權:from guardian.shortcuts import assign_permassign_perm('change_article', user, article) # 允許 user 修改特定文章
3. 使用 django-rules
規則引擎
- 通過函數定義權限規則:
import rules@rules.predicate def is_author(user, article):return article.author == user
五、總結
功能 | Django 默認 RBAC | 擴展方案 |
---|---|---|
用戶管理 | ? | ? |
組管理 | ? | ? |
基于模型權限 | ? | ? |
對象級權限 | ? | django-guardian |
細粒度角色管理 | ? | 自定義模型 |
動態權限規則 | ? | django-rules |
Django 自帶用戶系統 提供了 用戶管理、身份驗證、權限控制,并包含 基礎 RBAC 機制,但如果需要 更復雜的權限管理(如對象級權限、動態規則),建議使用 django-guardian、django-rules 或自定義 RBAC 方案。