django-guardian:Django 对象级权限的简洁实现 文章目录django-guardianDjango 对象级权限的简洁实现1、这玩意儿是干嘛的2、装起来麻烦吗3、怎么用4、Admin 里也能用5、适合哪些人用django-guardianDjango 对象级权限的简洁实现django-guardian 在 GitHub 上已经拿到 3,903 Star。它是一个 Django 扩展只做一件事在 Django 自带的权限体系之上补上对象级别的权限控制。Django 原生的权限模型管的是「能不能改所有文章」guardian 让你能精确到「能不能改这一篇文章」。1、这玩意儿是干嘛的Django 自带的 auth 模块已经够用了用户、组、权限表都建好了。但它有个局限权限是全局的。你给某个用户分配了「change_post」权限他就能改所有文章。实际业务里这种粒度太粗了。一个协作平台里A 用户只能编辑自己创建的项目B 用户可以编辑团队项目但不能碰别的团队的东西。这种场景下你需要的是针对单个对象的权限判定。django-guardian 就是填这个坑的。它增加了一层 ObjectPermissionBackend让你能给某个用户或某个组针对某个具体对象分配权限。2、装起来麻烦吗不麻烦三步搞定。先装包uvadddjango-guardian或者用 pip 也行pipinstalldjango-guardian然后改配置。settings.py 里加两行INSTALLED_APPS(...guardian,)AUTHENTICATION_BACKENDS(django.contrib.auth.backends.ModelBackend,guardian.backends.ObjectPermissionBackend,)最后跑迁移python manage.py migrate完事。3、怎么用核心就几个 shortcut 函数。最简单的场景给某个用户针对某个对象授权。fromdjango.contrib.auth.modelsimportUser,Groupfromguardian.shortcutsimportassign_perm jackUser.objects.create_user(jack,jackexample.com,topsecretagentjack)adminsGroup.objects.create(nameadmins)# 分配对象级权限assign_perm(change_group,jack,objadmins)# 检查针对这个具体对象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后台就会自动多出一个对象权限管理面板直接在页面上给用户或组分配针对单个实例的权限。fromdjango.contribimportadminfromguardian.adminimportGuardedModelAdminfrommyapp.modelsimportAuthorclassAuthorAdmin(GuardedModelAdmin):passadmin.site.register(Author,AuthorAdmin)如果你在用 django-unfold 美化后台guardian 也有现成的 contrib 模块支持不需要自己写适配代码。5、适合哪些人用做多租户系统、需要让不同用户只看到/操作自己数据的 Django 开发者做内容协作平台、需要细粒度权限控制的团队在 Django Admin 里就想完成权限分配、不想另搭一套权限后台的人测试覆盖率 97.8%维护得还算积极文档也齐全。如果你在用 Django 且被全局权限的限制卡过这个库值得看看。在 Django Admin 里就想完成权限分配、不想另搭一套权限后台的人测试覆盖率 97.8%维护得还算积极文档也齐全。如果你在用 Django 且被全局权限的限制卡过这个库值得看看。