尽管`user.has_perm(Model)`返回True,为什么user.has_perm(Model,obj)返回False?

时间:2019-03-23 15:13:40

标签: django django-authentication

在刚刚使用django-admin startproject./manage.py startapp创建的Django项目和应用程序中,我创建了以下模型:

class Book(models.Model):
    author = models.CharField(max_length=50)

然后我用./manage.py shell运行此代码:

from django.contrib.auth.models import Permission, User
from django.test import TestCase
from myapp.models import Book

myuser = User.objects.create_user(username="myuser")
myuser.user_permissions.add(Permission.objects.get(codename="change_book"))

mybook = Book(author="Joe Author")
mybook.save()

myuser.has_perm("myapp.change_book"))  # The result is True
myuser.has_perm("myapp.change_book", mybook))  # The result is False

这是为什么?用户 有权编辑mybook,不是吗? has_perm()应该如何工作?在某处有记录吗?

1 个答案:

答案 0 :(得分:2)

has_perm() API旨在与模型级权限(第二个参数为None)和对象级权限一起使用。但是,要由authentication backends个人来决定要支持什么。

对于Django默认的ModelBackend,有no support for object-level permissions

  

Django的权限框架为对象权限奠定了基础,尽管其核心没有实现。这意味着检查对象权限将始终返回False

ModelBackend documentation中也对此有所说明。

请注意,后端必须在此处返回False,因为从本质上来说,各个后端的结果都经过“或”运算。如果此后端返回了True,就不可能尊重其他后端的更精细的结果。

个后端实现了对象级权限,django-guardian也许是最著名的。看看它如何记录has_perm()

  

Django的ModelBackend之间的主要区别是我们可以在此处传递obj实例。