我正在做一个宠物项目。我需要确保只有授权用户才能发出 POST/PATCH 请求,并且只有项目的所有者才能更改/删除它们。
views.py(item_app)
class CreateItemView(APIView):
serializer_class = CreateItemSerializer
authentication_classes=[OwnAuthentication]
permission_classes=[IsAuthenticatedOrReadOnly, IsOnwerOrReadOnly]
... code ...
权限.py(item_app)
from rest_framework import permissions
class IsOnwerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.owner == request.user
身份验证.py(auth_app)
from django.contrib.auth.models import User
from rest_framework import authentication
from rest_framework import exceptions
class OwnAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
username = request.data.get('username')
if not username:
return None
try:
user= User.object.get(username=username)
except User.DoesNotExist:
raise exceptions.AuthenticationFailed('No such user')
return (user, None)
设置.py
AUTH_USER_MODEL = "auth_app.Users"
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
[授权是通过 JWT 令牌完成的,在登录时我获取访问令牌并将其复制并粘贴到邮递员中的“授权”标题中,当我启用此标题时,仍然出现错误在此处输入图像描述]1
在您的 settings.py 中, JWTAuthentication 设置为默认身份验证类。
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
但是,如果你看一下问题的最后部分,它说使用了 JWT 身份验证,但 CreateItemView 使用了不同的身份验证类。
class CreateItemView(APIView):
serializer_class = CreateItemSerializer
# authentication_classes=[OwnAuthentication]
permission_classes=[IsAuthenticatedOrReadOnly, IsOnwerOrReadOnly]
要为 CreateItemView 使用 JWT 认证类,请清除authentication_classes。
并且要应用多个权限类别,需要使用位运算符。
class CreateItemView(APIView):
serializer_class = CreateItemSerializer
authentication_classes=[OwnAuthentication]
permission_classes=[IsAuthenticatedOrReadOnly|IsOnwerOrReadOnly]
# or
permission_classes=[IsAuthenticatedOrReadOnly&IsOnwerOrReadOnly]
最后,如果您查看您提供的最后一张图片,您传递的值中未指定令牌类型。您的项目使用了 JWT 身份验证,您需要在开头添加 'Bearer' 并提供 access_token。
授权:'承载{access_token}'