如何使Django REST身份验证有效?

时间:2018-08-30 03:18:49

标签: django api authentication django-rest-framework

我在理解如何使身份验证正常工作时遇到了麻烦。我已经设置了基本的api,并且正在尝试使任何类型的身份验证都能正常工作(从基本身份验证开始)。但是无论做什么,我都可以从数据库中检索信息(使用Postman),而无需输入用户名或密码。我在做什么错了?

这是我的课程:

class User(models.Model):
    birthdate = models.DateField()
    gender = models.CharField(
        max_length=1,
        choices=(('M', 'Male'), ('F', 'Female'), ('O', 'Other'), ('U', 'Unspecified'))
    )
    join_date = models.DateField(auto_now_add=True)
    username = models.CharField(max_length=25, unique=True)
    password = models.CharField(max_length=25,)

这是我的观点:

def user_tester(request):
    permission_classes = (IsAuthenticated,)
    if request.method == 'GET':
        objs = User.objects.all()
        serializer = UserSerializer(objs, many=True)
        return JsonResponse(serializer.data, safe=False) 

以下是相关设置:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

请告知我我做错了什么。我对Django有一定的经验,但对身份验证或权限一点都不了解。

2 个答案:

答案 0 :(得分:4)

代替使用:permission_classes = (IsAuthenticated,), 您应该在定义“ user_tester”方法之前尝试装饰器,例如:

from rest_framework.decorators import api_view, permission_classes

@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
def user_tester(request):
    objs = User.objects.all()
    serializer = UserSerializer(objs, many=True)
    return JsonResponse(serializer.data, safe=False)    

答案 1 :(得分:2)

以下行是无效代码:

permission_classes = (IsAuthenticated,)

您没有通过扩展任何django rest框架类来创建视图。只有APIView之类的类具有您可以用来控制身份验证的Permissions_classes属性。您拥有的是一个基于函数的简单视图,该视图仅返回json。您甚至没有在这里使用django-rest-framework。您的序列化代码可以替换为to_dictjson.dumps

如果您想继续使用当前方法,请将FBV装饰为

@api_view(['GET'])
@permission_classes((IsAuthenticated, ))

但是使用DRF,您最好使用CBV方法。