Дизайнер разрешений Django is_staff
Я пытаюсь ограничить доступ к страницам, используя 2 пользовательских уровня. Суперпользователь и администратор.
Суперпользователь является обычным пользователем Django с назначенным "is_superuser".
Пользователь Admin также является обычным пользователем, которому назначено только разрешение 'is_staff'.
Проблема в том, что когда я использую этот декоратор для пользователя admin, он не проходит тест:
@permission_required('is_staff')
def my_view(....)
@permission_required('is_staff')
возвращает false для анонимных пользователей. (Правильный)
@permission_required('is_superuser')
возвращает true только для суперпользователей (правильно)
@permission_required('is_staff')
возвращает FALSE для пользователей с назначенной переменной 'is_staff'. (Неправильно).
Любые мысли?
Ответы
Ответ 1
is_staff
не является разрешением, поэтому вместо permission_required
вы можете использовать:
@user_passes_test(lambda u: u.is_staff)
или
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
Ответ 2
для классов, основанных на классах, вы можете добавить permission_required('is_staff')
в urls.py
:
from django.contrib.auth.decorators import permission_required
url(r'^your-url$', permission_required('is_staff')(YourView.as_view()), name='my-view'),
Ответ 3
ВНИМАНИЕ: после тщательной проверки этого решения не работает
В Django 1.10 работает работа @Николая Георгиева.
В CBV вы можете использовать The PermissionRequiredMixin mixin
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.http import HttpResponse
class MyView(PermissionRequiredMixin, View):
permission_required = 'is_staff'
def get(self, request):
return HttpResponse('result')