Django Rest Framework IsAuthenticated 权限错误匿名用户

Posted

技术标签:

【中文标题】Django Rest Framework IsAuthenticated 权限错误匿名用户【英文标题】:Django Rest Framework IsAuthenticated permission Error Anonymous user 【发布时间】:2018-05-20 13:12:43 【问题描述】:

我正在使用 django rest 框架使用 Token Authentication 方法编写 api,如下所示

@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
def ah(request, format=None):
    result = request.user.is_authenticated()
 
    content = "hello":result
    return Response(content)

我的设置是

    REST_FRAMEWORK = 
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAdminUser',
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        #'rest_framework.authentication.BasicAuthentication',
        #'rest_framework.authentication.SessionAuthentication'
    
    )


    MIDDLEWARE_CLASSES = [

    'django.contrib.sessions.middleware.SessionMiddleware',
    #'middleware.FirstTokenAuth.AuthenticationMiddlewareJWT',
    #'middleware.TokenAuthTest.JWTAuthenticationMiddleware',   
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.security.SecurityMiddleware',
    #'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
   
    #'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    
]

当我使用 IsAdminUserpermission 类调用此 API 时,django restframework 返回:

403 响应“详细信息”:“未提供身份验证凭据。”如果标头中没有提供令牌

401 响应“详细信息”:“您无权执行此操作。” 如果令牌不是管理员用户

但是当我设置时主要问题就在这里

@permission_classes((IsAuthenticated, ))

即使我没有在标头中添加令牌并且返回的用户是匿名用户,API 也会正常调用而不会返回 403 或 401。 如何防止匿名用户调用 API 并为他返回 403 响应。

请帮忙!!

【问题讨论】:

问题在于 Authentication 没有权限,身份验证后端将其设置为 authenticated 。您是否已将 'rest_framework.authtoken' 添加到 INSTALLED_APPS .. 您是否在创建令牌? 嗨 @SajiXavier 是的,我将 restframework.authtoken 添加到已安装的应用程序并创建了令牌并保存在数据库中 【参考方案1】:

@permission_classes 用于识别 api 是否需要身份验证。如果要使用令牌,请尝试在里面添加@authentication_classesTokenAuthentication。这将检查标头中的令牌并在请求中创建用户对象。

【讨论】:

【参考方案2】:

使用这个:

permission_classes = [permissions.IsAuthenticated,]

它对我有用。

【讨论】:

以上是关于Django Rest Framework IsAuthenticated 权限错误匿名用户的主要内容,如果未能解决你的问题,请参考以下文章

怎么安装django rest framework

django rest framework中文介绍

17-Django-Django REST framework-REST framework及RESTful简介

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

Django:rest framework之分页(Pagination)

django使用rest_framework