Django Model Permissions with Django Guardian: 使用Django Guardian进行模型权限控制

2023-04-07 00:00:00 模型 权限 控制

Django Guardian是一个第三方扩展,允许您使用标准的Django模型和用户模型来实现基于对象的权限控制。它与基于组的权限控制不同,它允许您为特定模型的每个实例定义不同的权限。
1. 首先安装django-guardian:

pip install django-guardian
  1. 在settings.py文件中添加guardian和guardian扩展的AUTHENTICATION_BACKENDS(用于验证用户权限):
INSTALLED_APPS = (
    ...
    'guardian',
    ...
)
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', # 默认的验证器
    'guardian.backends.ObjectPermissionBackend', # guardian验证器
)
  1. 创建权限控制需要控制的模型并进行数据库迁移:
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)
  1. 在任何视图中初始化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进行模型权限控制的基本步骤。您可以使用它来定义任何自定义权限,并为特定的用户或组分配这些权限。

相关文章