【问题标题】:Django DRF: custom Permission: tokenauthentication: Why to use isAuthenticated for permissionDjango DRF:自定义权限:tokenauthentication:为什么要使用 isAuthenticated 来获得权限
【发布时间】:2021-03-16 22:31:51
【问题描述】:

我有以下


REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    )
}

DRF 如何获得request.user

def hello_world(request):
    print(request.user)
    return Response()

我在努力

curl --location --request GET "http://127.0.0.1:8000/hello-world/" \
--header "Authorization:Token ssssss28acbd550a9806c6ac9ce13f1bbc73137" \
--header 'Content-Type: application/json'

所以在输出中我看到request.user 是根据提供的令牌打印的,例如:test

那使用isAuthenticated有什么用

它只检查是否提供了 Authentication 标头

为什么tokenauthentication 自己不能检查

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    据我了解,令牌身份验证不是自定义权限。身份验证和许可是两件不同的事情。

    如果您查看 DRF 网站 https://www.django-rest-framework.org/api-guide/authentication/,他们会说:

    身份验证是将传入请求与一组识别凭据相关联的机制,例如请求来自的用户或用于签名的令牌。然后,权限和限制策略可以使用这些凭据来确定是否应允许请求。

    因此,身份验证是您如何对用户进行身份验证的基础机制,例如令牌身份验证、会话身份验证等...权限控制是否应根据从身份验证机制中检索到的识别凭据授予请求。

    因此,在您的示例中,默认身份验证机制使用令牌。这适用于您的所有视图(除非您在特定视图中显式覆盖它)。然后向 hello_world 视图处理的端点发送一个 http 请求。在此 http 请求中,您在标头中提供了一个令牌。身份验证机制将尝试将此令牌与数据库中唯一的 django 用户模型实例进行匹配。这是通过扩展标准 django HttpRequest 的 DRF 的 Request 类发生的,该类的一个实例被传递给 hello_world 视图。如果深入研究源码可以看到request.user中的user有一个属性装饰器:

    @property
        def user(self):
            """
            Returns the user associated with the current request, as authenticated
            by the authentication classes provided to the request.
            """
            if not hasattr(self, '_user'):
                with wrap_attributeerrors():
                    self._authenticate()
            return self._user
    

    如果之前没有设置self._user,那么request.user 会在后台触发身份验证机制并返回一个django 用户模型实例。我认为这大致就是 DRF 获取request.user 的方式。

    再次回答您问题的第二部分,令牌身份验证仅指机制,它不进行任何检查。所以使用 isAuthenticated 权限是为了确保只有经过令牌认证的认证用户才能获得成功的响应。删除 isAuthenticated 将允许用户在不提供令牌的情况下接收成功的响应。

    【讨论】:

    • 除非我错过了它,否则我看不到 DRF 文档中的哪个地方说入站令牌被翻译成与之关联的用户对象。这是直观的行为,我期望如此,但没有说明。谢谢。
    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2019-05-09
    • 2020-07-23
    • 2013-09-28
    • 1970-01-01
    • 2022-08-03
    • 2021-09-17
    相关资源
    最近更新 更多