Django REST Framework只允许超级用户访问api Web视图

时间:2018-05-14 14:54:19

标签: django django-rest-framework django-authentication

我正在使用Django 2.0Django RESET Framework为我的申请撰写REST API

我已配置以下身份验证方法

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

截至目前,它允许所有经过身份验证的用户访问web api视图。

我想要的是允许少数用户(可能是superadmin用户)通过登录从会话身份验证或Web浏览器访问API。

  

编辑2:contacts / views.py

class ContactViewSet(viewsets.ModelViewSet):
    queryset = Contact.objects.all()
    serializer_class = ContactSerializer
    permission_classes = (IsAuthenticated,)

    def perform_create(self, serializer):
        serializer.save(user_id=self.request.user)

3 个答案:

答案 0 :(得分:2)

因此,您可以利用permission_classes来执行此操作。 DRF的Request对象会记住在名为_authenticator的属性中使用的身份验证方法。你可以用这个;并使用permission_classes来确定这对(用户,身份验证者)是否具有权限

class AdminAuthenticationPermission(permissions.BasePermission):
    ADMIN_ONLY_AUTH_CLASSES = [rest_framework.authentication.BasicAuthentication, rest_framework.authentication.SessionAuthentication]

    def has_permission(self, request, view):
        user = request.user
        if user and user.is_authenticated():
            return user.is_superuser or \
                not any(isinstance(request._authenticator, x) for x in self.ADMIN_ONLY_AUTH_CLASSES) 
        return False

class ContactViewSet(viewsets.ModelViewSet):
    queryset = Contact.objects.all()
    serializer_class = ContactSerializer
    permission_classes = (IsAuthenticated, AdminAuthenticationPermission,)

未经测试:但应该有效

答案 1 :(得分:0)

对于Django 2(添加到views.py中)

from rest_framework.permissions import IsAdminUser

class IsSuperUser(IsAdminUser):
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_superuser)

class ListSmth(ListCreateAPIView):
    permission_classes = (IsSuperUser,)
    ... Your code...

答案 2 :(得分:0)

已经有一个名为 IsAdminUser 的内置类,将其指定为 permission_classes 属性的值

from rest_framework.permissions import  IsAdminUser
     class A:
       permission_classes = (IsAdminUser,)

这会检查值

reques.user.isStaff == True