2016-01-15 67 views
0

我正在使用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())失败,则检查基本上是重新:

回答

1

我已经通过继承PermissionRequiredMixin像这样拿出一个解决办法 - 为匿名用户运行。我根据PermissionRequiredMixin.check_permissionsguardian.utils.get_403_or_None(后者由前者调用)if forbidden:块中的代码。我必须这样做,因为check_permissionsget_403_or_None使用request.user