【问题标题】:Conditionally authenticate users to DRF view有条件地对 DRF 视图的用户进行身份验证
【发布时间】:2021-05-07 19:28:53
【问题描述】:

我有这样的 DRF 视图:

class DocumentsView(generics.ListCreateAPIView):
    permission_classes = ()
    authentication_classes = ()
    # I typically enforce authentication with 
    # authentication_classes = (JWTCookieAuthentication,)

    def list(self, request):
        pagination_class = None
        
        if request.user.is_authenticated: 
           ... return protected data ...
        else:
           ... return generic data ...

我希望允许发送有效令牌的用户和未发送有效令牌的用户都从该端点获得响应。但是,request.user.is_authenticated 返回False,即使发送了有效的令牌(我明白为什么)。如何尝试对用户进行身份验证,但即使不提供令牌仍允许他们继续?

或者更好的做法是对经过身份验证的未经身份验证的用户不具有相同的视图?

【问题讨论】:

  • 但是,request.user.is_authenticated 返回 False,即使发送了有效的令牌(我明白为什么)。 我不知道。是认证后端没有让用户登录还是认证中间件没有运行?
  • @Melvyn,因为视图中的 authentication_classes = () 覆盖了我的 DEFAULT_AUTHENTICATION_CLASSES

标签: django rest authentication django-rest-framework api-design


【解决方案1】:

您想要的是没有权限,但仍然执行身份验证

身份验证验证令牌,从数据库中获取用户等。如果禁用它,则不会执行令牌/等检查。这意味着request.user 将始终等于AnonymousUser

class MyView(ListCreateApiView):
    permissions_classes = [AllowAny]
    

值得考虑使用AllowAny 作为您的许可。这与使用空白列表[] 相同,但明确您的意图是公开视图,而不是错误。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2013-06-16
    • 2020-09-29
    • 2021-10-26
    • 2013-03-11
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    相关资源
    最近更新 更多