权限类 IsAuthenticated 在 DRF 中不起作用

Posted

技术标签:

【中文标题】权限类 IsAuthenticated 在 DRF 中不起作用【英文标题】:permission classes IsAuthenticated not working in DRF 【发布时间】:2019-05-09 23:40:09 【问题描述】:

我使用了令牌身份验证,它工作正常,即它正在对用户进行身份验证,然后用户登录。但在我看来,我已将其中一个视图的权限类设置为 IsAuthenticated,但事实并非如此即使他是经过身份验证的用户,也允许用户。 下面是显示我已登录 (jadhav@gmail.com) 的屏幕截图:

下一个标签显示“未提供身份验证详细信息”:

谁能告诉我怎么了? 好的,我提供详细信息: 这些是我的设置:

REST_FRAMEWORK = 
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated', )

这就是我的身份验证方式:

类 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)

我设置限制的另一个视图:

类 BoardCreateAPIView(CreateAPIView):

queryset = Boards.objects.all()
serializer_class = BoardCreateSerializer
permission_classes = (IsAuthenticated,)

【问题讨论】:

我认为内置的 api 文档不允许发帖?我可能是错的。检查浏览器开发工具并确保您实际上正在发送带有令牌的帖子。也就是说,您应该添加有关如何添加权限类以及如何添加令牌的更多信息 另外,验证所需的标头是Authorization,因此请确保您的令牌在那里 您可以使用 Postman 对 header 进行设置验证 @Jason 编辑以提供更多信息 @MohammadAli 试图提供更多信息,现在你可以知道我在哪里搞砸了.. 【参考方案1】:

在 django rest 框架中,您应该在请求标头中提供令牌。这是带有 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

【讨论】:

我试图提供更多信息..你可以看看 您阅读了这篇文章还是通过我提供的令牌标头发送了它?只需获取令牌,然后使用 Authorization: Token &lt;your token&gt; 标头集向您的 Url 发送请求。【参考方案2】:

正如@Reza 暗示的那样,您错过了令牌身份验证的要点。您正在尝试改用基本身份验证流程。流程是这样的:

    客户端使用登录名和密码从服务器请求令牌 服务器验证您的凭据是否正确,创建令牌并将其返回给客户端

    在后续请求中,客户端将令牌添加到 Auth 标头中,如下所示:

    Authorization: Token &lt;the_client_token&gt;

因此,您应该在登录视图中做的是验证用户凭据并创建一个令牌。您不应该尝试自己执行身份验证。您可以将视图重命名为obtain_token,以免混淆其功能。

查看文章@Reza 链接了解更多信息。

【讨论】:

以上是关于权限类 IsAuthenticated 在 DRF 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

06.drf(django)的权限

在 DRF 中确定 IsAuthenticated 使用 DRF-JWT 检索使用 Postman 测试的列表

DRF 版本认证权限限制解析器和渲染器

DRF 版本认证权限限制解析器和渲染器

DRF的权限和频率

drf认证权限频率