Django Model Permissions with Django Guardian: 使用Django Guardian进行模型权限控制
Django Guardian是一个第三方扩展,允许您使用标准的Django模型和用户模型来实现基于对象的权限控制。它与基于组的权限控制不同,它允许您为特定模型的每个实例定义不同的权限。
1. 首先安装django-guardian:
pip install django-guardian
- 在settings.py文件中添加guardian和guardian扩展的AUTHENTICATION_BACKENDS(用于验证用户权限):
INSTALLED_APPS = ( ... 'guardian', ... ) AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', # 默认的验证器 'guardian.backends.ObjectPermissionBackend', # guardian验证器 )
- 创建权限控制需要控制的模型并进行数据库迁移:
from django.db import models from django.contrib.auth.models import User from guardian.shortcuts import assign_perm class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey(User) def __str__(self): return self.title class Meta: permissions = ( ("view_article", "Can view article"), ("edit_article", "Can edit article"), ("delete_article", "Can delete article"), ) assign_perm("view_article", User.objects.get(username='myuser'), article)
- 在任何视图中初始化ObjectPermissionBackend后,您就可以轻松地检查和授予对象权限。让我们编写一个视图,根据登录的用户显示所有文章:
from django.shortcuts import render from django.contrib.auth.decorators import login_required from guardian.shortcuts import get_objects_for_user from myapp.models import Article @login_required def article_list(request): articles = get_objects_for_user(request.user, 'view_article', Article) return render(request, 'myapp/article_list.html', {'articles': articles})
在此代码中,我们获取具有view_article权限的当前登录用户的所有文章,并将它们呈现在模板中。
5. 最后,我们将为每个Article对象分配一个特定用户的权限:
from django.contrib.auth.models import User from guardian.shortcuts import assign_perm, remove_perm from myapp.models import Article myuser = User.objects.get(username='myuser') article = Article.objects.get(title='My Article') assign_perm("view_article", myuser, article) assign_perm("edit_article", myuser, article) remove_perm("edit_article", myuser, article)
在此代码中,我们为一个特定的用户分配了view_article和edit_article权限,并从同一用户的文章中删除了edit_article权限。
这就是使用Django Guardian进行模型权限控制的基本步骤。您可以使用它来定义任何自定义权限,并为特定的用户或组分配这些权限。
相关文章