1

我正在尝试使用 django rest framework isauthenticated 权限和 TokenAuthentication API 方法来验证我的 Web 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 的后端进行身份验证的。

如何防止匿名用户通过身份验证并使用 django rest 框架为他们返回 403 响应错误

我很感激任何帮助

4

2 回答 2

1

实际上在 django rest 框架中定义了许多用于验证目的的类。我猜你的情况是你需要以下一组装饰器:

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

考虑到您已正确设置标题,上述代码不会有问题。

于 2018-09-02T14:56:14.563 回答
0

你可以这样做,

为了保证安全并始终向用户询问令牌,并且您不需要调用 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',
    ]
}

于 2021-01-06T04:41:57.373 回答