Django guardian:如何授予所有用户匿名用户的权限



我正在使用django-guardian在我的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 Guardian 是否提供了某种方式来授予注册用户与匿名用户相同的权限?或者,如果用户没有权限,但匿名用户有权限,也许有某种方法可以子类化 PermissionRequiredMixin 以允许该操作?

我想出了一个解决方法,通过子类化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()的调用),则基本上会为匿名用户重新运行检查。我将if forbidden:块中的代码基于 PermissionRequiredMixin.check_permissionsguardian.utils.get_403_or_None(后者是从前者调用的)。我不得不这样做,因为check_permissionsget_403_or_None都使用request.user

相关内容

  • 没有找到相关文章

最新更新