权限 类 IsAuthenticated 在 DRF 中不起作用
permission classes IsAuthenticated not working in DRF
我使用了令牌身份验证,它工作正常,即它正在对用户进行身份验证,然后用户登录。但在我看来,我已经将权限 classes 设置为 IsAuthenticated 之一意见,即使他是经过身份验证的用户,也不允许用户访问。
下面是显示我已登录的屏幕截图 (jadhav@gmail.com) :
下一个标签显示 "authentication details not provided":
有人能告诉我哪里出了问题吗?
好的,我提供详细信息:
这些是我的设置:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', )
}
我是这样认证的:
class UserLoginAPIView(APIView):
permission_classes = [AllowAny]
serializer_class = UserLoginSerializer
def post(self, request, *args, **kwargs):
data = request.data
serializer = UserLoginSerializer(data=data)
if serializer.is_valid(raise_exception=True):
# new_data = serializer.data
if serializer.data:
user = authenticate(username=request.data['username'], password=request.data['password'])
login(request, user)
print("IsAuthenticated", user.is_authenticated)
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key},
status=HTTP_200_OK)
我设置限制的另一个视图:
class BoardCreateAPIView(CreateAPIView):
queryset = Boards.objects.all()
serializer_class = BoardCreateSerializer
permission_classes = (IsAuthenticated,)
在 django rest 框架中,您应该在请求中提供令牌 headers。这是带有 curl 命令的示例:
curl -X POST -H "Content-Type: application/json" -H "Authorization: Token <MY_TOKEN>" http://my-api-url
还要检查你的 settings.py
中是否至少有这些行:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}
要了解更多信息,请阅读此内容doc from django rest framework
正如@Reza 暗示的那样,您错过了令牌身份验证的要点。您正在尝试改用基本身份验证流程。流程是这样的:
- 客户端使用登录名和密码从服务器请求令牌
- 服务器验证您的凭据是否正确,创建一个令牌并将其returns发送给客户端
在后续请求中,客户端将令牌添加到 Auth header,如下所示:
Authorization: Token <the_client_token>
因此,您应该在登录视图中执行的操作是验证用户凭据并创建令牌。您不应该尝试自己执行身份验证。您可以将视图重命名为 obtain_token
,以免混淆其功能。
查看链接的@Reza 文章以获取更多信息。
我使用了令牌身份验证,它工作正常,即它正在对用户进行身份验证,然后用户登录。但在我看来,我已经将权限 classes 设置为 IsAuthenticated 之一意见,即使他是经过身份验证的用户,也不允许用户访问。 下面是显示我已登录的屏幕截图 (jadhav@gmail.com) :
下一个标签显示 "authentication details not provided":
有人能告诉我哪里出了问题吗? 好的,我提供详细信息: 这些是我的设置:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', )
}
我是这样认证的:
class UserLoginAPIView(APIView):
permission_classes = [AllowAny]
serializer_class = UserLoginSerializer
def post(self, request, *args, **kwargs):
data = request.data
serializer = UserLoginSerializer(data=data)
if serializer.is_valid(raise_exception=True):
# new_data = serializer.data
if serializer.data:
user = authenticate(username=request.data['username'], password=request.data['password'])
login(request, user)
print("IsAuthenticated", user.is_authenticated)
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key},
status=HTTP_200_OK)
我设置限制的另一个视图:
class BoardCreateAPIView(CreateAPIView):
queryset = Boards.objects.all()
serializer_class = BoardCreateSerializer
permission_classes = (IsAuthenticated,)
在 django rest 框架中,您应该在请求中提供令牌 headers。这是带有 curl 命令的示例:
curl -X POST -H "Content-Type: application/json" -H "Authorization: Token <MY_TOKEN>" http://my-api-url
还要检查你的 settings.py
中是否至少有这些行:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}
要了解更多信息,请阅读此内容doc from django rest framework
正如@Reza 暗示的那样,您错过了令牌身份验证的要点。您正在尝试改用基本身份验证流程。流程是这样的:
- 客户端使用登录名和密码从服务器请求令牌
- 服务器验证您的凭据是否正确,创建一个令牌并将其returns发送给客户端
在后续请求中,客户端将令牌添加到 Auth header,如下所示:
Authorization: Token <the_client_token>
因此,您应该在登录视图中执行的操作是验证用户凭据并创建令牌。您不应该尝试自己执行身份验证。您可以将视图重命名为 obtain_token
,以免混淆其功能。
查看链接的@Reza 文章以获取更多信息。