如何让 Django REST 身份验证工作?



我无法理解如何让身份验证工作。 我已经设置了一个基本的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 有一些经验,但根本没有身份验证或权限。

而不是使用: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)    

以下行是死代码:

permission_classes = (IsAuthenticated,)

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

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

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

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

相关内容

最新更新