Django rest framework Анонимный пользователь всегда проходит проверку подлинности

Я пытаюсь аутентифицировать мой метод веб-API с помощью django rest framework, авторизованным разрешением и TokenAuthentication Метод API:

@api_view(['Post'])
@permission_classes((IsAuthenticated,))
def listofgroups(request):
    try:
        logout(request)
        data = request.data
        page_size = data.get('pagesize')
        page_number = data.get('pagenumber')
        group_qs = Group.objects.all()
        paginator = Paginator(group_qs, int(page_size))
        group_list = paginator.page(int(page_number))
        #group_list = tools.paginate_query_set(group_qs, 1, 3)
        #list  = group_list[0]['model']
        groups = [get_group_dto(g) for g in group_list]
        sorted_groups = sorted(groups, key=lambda k: k['user_count'], reverse = True)
        group_list_dto = {
        "grps": sorted_groups, 
        "success":1,
        "fail":0
        }
        return Response(group_list_dto)
    except Exception as e:
        #.error("Error %s"(e), exc_info = 1) 
        return Response({"success" : 0, "error": str(e)})

По сути, я всегда должен устанавливать авторизацию в шапке, например:

"Авторизация":"Токен a26171d30745cc94bcd6ac42d9bc94e1d3992948"

этот токен основан на rest_framework.authtoken

Ошибка в том, что я могу получить данные с ответом 200, даже не установив токен в заголовке, потому что он возвращает анонимного пользователя, который аутентифицирован с бэкэнда в django.

Как я могу предотвратить аутентификацию анонимных пользователей и вернуть ошибку ответа 403 для них с помощью django rest framework

Я ценю любую помощь

2 ответа

На самом деле в django rest framework для валидации определено много классов. В вашем случае я предполагаю, что вам понадобится следующий набор декораторов:

@api_view(['POST'])
@authentication_classes((TokenAuthentication,))
@permission_classes((IsAuthenticated,))

Учитывая, что вы правильно установили заголовок, это не будет проблемой для приведенного выше кода.

ты можешь это сделать,

чтобы оставаться в безопасности и всегда запрашивать у пользователя токен, и вам не нужно вызывать permission_classes, он автоматически будет isAuthenticated

      REST_FRAMEWORK = {
    DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ]
}

Другие вопросы по тегам