2012-07-03 60 views
3

我需要允許管理員管理我網站上模型的權限。目前,組,用戶和權限在這方面做得很好。但是,我還需要允許管理員管理未經身份驗證的用戶(匿名用戶)的權限。文檔說匿名用戶的組總是空的,那麼我如何允許管理他們的權限?Django - 匿名用戶組

回答

4

向匿名用戶添加權限很奇怪。 Docs說:

Django的權限框架沒有地方爲匿名用戶存儲 權限。但是,它有一個基礎,即 允許自定義身份驗證後端爲匿名用戶指定授權。這對 可重複使用的應用程序的作者特別有用,他們可以將授權的所有問題委託給驗證後端,而不需要設置,例如控制 匿名訪問。

因此,您可以將權限設置爲anon yuser,但是使用自定義auth後端。 有時最好使用聲明權限檢查,使用與所需的權限的意見裝飾,如:(含匿名用戶)

@permission_required('somemodel.can_add') 
def add_model(request): 

或離開它不受限制的每一個人。或者一些自定義的權限檢查..

或者,如果你想擁有的權限,無論如何,你總是可以創建一個虛擬用戶,讓我們說「AnonUser」,給它的權限,然後檢查權限有類似:

if not user.is_authenticated(): 
    dummy_user = User.objects.get(name="AnonUser") 
    if dummy_user.has_perm("somepermission"): 
     # bla bla bla 

,但是這是我從來沒有使用..

+0

虛擬用戶方法可能是我唯一的選擇,因爲我需要讓管理員從管理員管理anon perms。它確實感到噁心,但... – guywhoneedsahand

+0

然後,它可能會更好地實現一個簡單的身份驗證後端,並強制匿名用戶與虛擬用戶登錄。完全禁用匿名用戶。 – Tisho

+0

Perphaps你可以在中間件類中分配虛擬用戶? – blaze

0

我已經有一個自定義的後端提供一個匿名組(如@Tisho suggests),它可以很容易地從管理界面進行編輯。將添加到settings.py(例如'appname.auth_backend.AnonymousPermissions')中。

請注意,在檢查權限之前(例如login_required)需要登錄是很常見的情況,因此只能使用僅限權限進行檢查。

from django.contrib.auth.models import Group 

class AnonymousPermissions(object): 

    def get_anonymous_permissions(self): 
     #largely from django.contrib.auth.backends 
     group, group_created = Group.objects.get_or_create(name='Anonymous') 
     perms = group.permissions.all() 
     perms = perms.values_list('content_type__app_label', 'codename').order_by() 
     perms = set("%s.%s" % (ct, name) for ct, name in perms) 
     return perms 

    def get_group_permissions(self, user_obj, obj=None): 
     if user_obj.is_anonymous: 
      perm_cache_name = '_anonymous_perm_cache' 
      if not hasattr(user_obj, perm_cache_name): 
       setattr(user_obj, perm_cache_name, self.get_anonymous_permissions()) 
      return getattr(user_obj, perm_cache_name) 
     return set() 

    def get_all_permissions(self, user_obj, obj=None): 
     return self.get_group_permissions(user_obj, obj) 

    def has_perm(self, user_obj, perm, obj=None): 
     return perm in self.get_group_permissions(user_obj, obj)