我正在使用django-guardian在我的Django项目中实现每个对象的权限。我遇到了注册用户无法查看匿名用户能够查看的对象的问题。我曾经想过,如果匿名用户有权限,那么注册用户应该拥有相同的权限(我无法想象我的网站的一部分,我希望匿名用户能够做些事情和注册用户而不是能够做点什么)。Django监护人:如何为所有用户授予匿名用户的权限
from core.models import MyObject
from django.contrib.auth.models import User
from guardian.shortcuts import
from guardian.utils import get_anonymous_user
m = MyObject.objects.get(id=1)
u = User.objects.get(username="MyUser")
anon = get_anonymous_user()
anon.has_perm('view_object', m)
#^Prints True
u.has_perm('view_object', m)
#^Prints False
在我的项目中,我有一些可以是“公共”或“私人”的对象。当用户将该对象标记为“公开”时,我向匿名用户授予“view_object”权限。我的观点的使用PermissionRequiredMixin
受到保护,就像这样:
class MyObjectDetailsView(PermissionRequiredMixin, DetailView):
model = MyObject
permission_required = 'view_object'
不Django的监护人提供给注册用户相同的权限匿名用户某种方式?或者,如果用户没有权限但是匿名用户有这种权限,那么PermissionRequiredMixin可以有一些方法来允许该操作?
from guardian.mixins import PermissionRequiredMixin
from guardian.utils import get_anonymous_user
class PermissionRequiredMixinWithAnonymous(PermissionRequiredMixin):
def check_permissions(self, request):
forbidden = super(PermissionRequiredMixinWithAnonymous, self).check_permissions(request)
if forbidden:
perms = self.get_required_permissions(request)
anon = get_anonymous_user()
obj = self.get_permission_object()
has_permissions = all(anon.has_perm(perm, obj) for perm in perms)
if has_permissions:
forbidden = None
return forbidden
如果权限检查在用户登录(这是调用super()
)失败,则检查基本上是重新: