2012-07-03 4 views
3

Мне нужно разрешить администраторам управлять разрешениями для моделей на моем сайте. Группы, пользователи и разрешения отлично справляются с этим прямо сейчас. Однако мне также необходимо разрешить администраторам управлять разрешениями пользователей, не прошедших проверку подлинности, - анонимных пользователей. Документы говорят, что группа анонимного пользователя всегда пуста, поэтому как я могу разрешить администрирование своих прав?Django - Анонимная группа пользователей

ответ

4

Странно добавлять разрешения для анонимных пользователей. Docs сказать: основа разрешения

Джанго не имеет места для хранения разрешений для анонимных пользователей. Тем не менее, у него есть основание, что позволяет настраивать аутентификационные базы для авторизации для анонимных пользователей. Это особенно полезно для авторов повторно используемых приложений, которые могут делегировать все вопросы авторизации на бэкэнд auth , а не на необходимость настроек, например, для управления анонимным доступом .

Таким образом, вы можете установить разрешения для anon yuser, но с пользовательским auth backend. Иногда лучше использовать декларативную проверку прав доступа, используя декоратор на взглядах с необходимыми разрешениями, например: (. Включая анонимный пользователь)

@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

Подход, основанный на подходе, может быть моим единственным вариантом, учитывая, что мне нужно, чтобы администраторы управляли анонсами от администратора. Это действительно неприятно, хотя ... – guywhoneedsahand

+0

Тогда, вероятно, лучше реализовать простой сервер аутентификации и заставить пользователей анонимных пользователей регистрироваться с помощью фиктивного пользователя. И вообще отключить анонимного пользователя. – Tisho

+0

Перфорирование вы можете назначить фиктивного пользователя в классе промежуточного программного обеспечения? – blaze

0

Я пошел с пользовательским сервером для обеспечения анонимной группы (как @Tisho suggests), который может быть легко отредактирован с помощью интерфейса администратора. Добавьте следующий класс в AUTHENTICATION_BACKENDS в 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) 
Смежные вопросы