django-guardian:Django 对象级权限的简洁实现
django-guardian:Django 对象级权限的简洁实现
django-guardian 在 GitHub 上已经拿到 3,903 Star。
它是一个 Django 扩展,只做一件事:在 Django 自带的权限体系之上,补上对象级别的权限控制。Django 原生的权限模型管的是「能不能改所有文章」,guardian 让你能精确到「能不能改这一篇文章」。

1、这玩意儿是干嘛的
Django 自带的 auth 模块已经够用了,用户、组、权限表都建好了。但它有个局限:权限是全局的。你给某个用户分配了「change_post」权限,他就能改所有文章。
实际业务里这种粒度太粗了。一个协作平台里,A 用户只能编辑自己创建的项目,B 用户可以编辑团队项目但不能碰别的团队的东西。这种场景下,你需要的是针对单个对象的权限判定。
django-guardian 就是填这个坑的。它增加了一层 ObjectPermissionBackend,让你能给某个用户或某个组,针对某个具体对象分配权限。
2、装起来麻烦吗
不麻烦,三步搞定。
先装包:
uv add django-guardian
或者用 pip 也行:
pip install django-guardian
然后改配置。settings.py 里加两行:
INSTALLED_APPS = (
...
'guardian',
)
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'guardian.backends.ObjectPermissionBackend',
)
最后跑迁移:
python manage.py migrate
完事。
3、怎么用
核心就几个 shortcut 函数。最简单的场景:给某个用户针对某个对象授权。
from django.contrib.auth.models import User, Group
from guardian.shortcuts import assign_perm
jack = User.objects.create_user('jack', 'jack@example.com', 'topsecretagentjack')
admins = Group.objects.create(name='admins')
# 分配对象级权限
assign_perm('change_group', jack, obj=admins)
# 检查:针对这个具体对象,jack 有权限
jack.has_perm('change_group', admins) # True
# 但全局权限仍然没有
jack.has_perm('change_group') # False
这就是 guardian 的关键设计:对象权限和全局权限分开存储、分开检查。has_perm('change_group', obj) 查的是对象级表,has_perm('change_group') 查的是 Django 原生的权限表,两者互不干扰。

4、Admin 里也能用
Django 的后台管理页面也可以集成 guardian。把 ModelAdmin 换成 GuardedModelAdmin,后台就会自动多出一个对象权限管理面板,直接在页面上给用户或组分配针对单个实例的权限。
from django.contrib import admin
from guardian.admin import GuardedModelAdmin
from myapp.models import Author
class AuthorAdmin(GuardedModelAdmin):
pass
admin.site.register(Author, AuthorAdmin)
如果你在用 django-unfold 美化后台,guardian 也有现成的 contrib 模块支持,不需要自己写适配代码。
5、适合哪些人用
- 做多租户系统、需要让不同用户只看到/操作自己数据的 Django 开发者
- 做内容协作平台、需要细粒度权限控制的团队
- 在 Django Admin 里就想完成权限分配、不想另搭一套权限后台的人
测试覆盖率 97.8%,维护得还算积极,文档也齐全。如果你在用 Django 且被全局权限的限制卡过,这个库值得看看。

浙公网安备 33010602011771号