首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django REST框架只允许超级用户访问api web视图

Django REST框架只允许超级用户访问api web视图
EN

Stack Overflow用户
提问于 2018-05-14 14:54:18
回答 3查看 7.3K关注 0票数 7

我使用Django 2.0Django RESET Framework为我的应用程序编写REST API

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

代码语言:javascript
复制
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

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

我想要的是允许很少的用户(可能是超级管理员用户)能够通过登录从会话身份验证或从web浏览器访问API。

编辑2:联系人/views.py

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-14 15:26:32

所以你可以利用permission_classes来做这件事。DRF的Request对象记住在名为_authenticator的属性中使用的身份验证方法。您可以使用此方法,并使用permission_classes来确定对(用户,身份验证器)是否具有权限。

代码语言:javascript
复制
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,)

未经测试:但应该有效

票数 3
EN

Stack Overflow用户

发布于 2019-05-28 09:03:55

为Django 2(添加于views.py)

代码语言:javascript
复制
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...
票数 10
EN

Stack Overflow用户

发布于 2021-01-07 08:03:31

已有名为IsAdminUser的内置类,请将其指定为permission_classes属性的值。

代码语言:javascript
复制
from rest_framework.permissions import  IsAdminUser
     class A:
       permission_classes = (IsAdminUser,)

这将检查值。

代码语言:javascript
复制
reques.user.isStaff == True
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50333330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档