Y.L6 2023-03-16 19:10 采纳率: 91.7%
浏览 55
已结题

django drf使用问题

是不是使用了drf和simplejwt进行登录验证,就无法使用原生的权限控制了,比如permission_requied,我这里使用了以后提示没有登录,但是我的session表里已经有token了,request.user里也有用户名字了

  • 写回答

8条回答 默认 最新

  • 极客智能体-在线 2023-03-18 14:59
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    在Django和DRF中,权限控制可以通过多种方式实现,如使用permission_required、自定义permission class、使用authentication class等。在使用DRF和SimpleJWT进行验证时,可以通过配置DEFAULT_AUTHENTICATION_CLASSESDEFAULT_PERMISSION_CLASSES来指定需要使用哪些配置类。但是请注意,权限验证和身份验证是两个不同的概念。身份验证通常用于验证用户是否已登录,而权限验证用于验证用户是否具有执行特定操作所需的权限。

    在使用DRF和SimpleJWT进行身份验证时,由于JWT令牌已经包含了用户信息,所以直接通过request.user获取。因此,使用permission_required进行权限验证时可能会失败,因为它的实现方式需要从session或cookie中获取用户id或其他信息,而不是从JWT令牌中获取。

    解决方案是使用DRF提供的permission_classes来指定你自己的权限验证类,比如IsAuthenticatedIsAdminUser等。下面是一个简单的示例代码:

    from rest_framework import permissions
    
    class MyPermission(permissions.BasePermission):
        message = 'You do not have permission to perform this action.'
    
        def has_permission(self, request, view):
            if request.user.is_authenticated and request.user.is_staff:
                return True
            return False
    
    
    class MyView(APIView):
        permission_classes = [MyPermission]
    
        def get(self, request):
            return Response({'message': 'Hello, world!'})
    

    在上面的代码中,我们自定义了一个MyPermission类,它继承自DRF的BasePermission类并覆盖了has_permission方法。在这个方法中,我们检查request.user是否为认证用户且是管理员。如果是,则说明该用户具有执行此行动所需的权限,否则将返回错误消息。最后,我们将该权限类分配给我们需要保护的视图。

    请注意,在使用DRF和SimpleJWT进行验证时,确保在settings.py中正确配置了DEFAULT_AUTHENTICATION_CLASSESDEFAULT_PERMISSION_CLASSES。例如:

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework_simplejwt.authentication.JWTAuthentication',
        ),
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAuthenticated',
        ]
    }
    

    以上配置将使用SimpleJWT进行验证,并将DRF提供的IsAuthenticated权限类分配给所有视图。如果你需要更高级的权限验证功能,如基于角色的访问控制(RBAC),可以使用第三方库,如django-guardiandjango-rules等。

    希望这个答案可以解决你的问题。
    如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 已采纳回答 3月18日
  • 赞助了问题酬金15元 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 双目摄像头标定后的校准文件
  • ¥15 从键盘输入不管多少字符或者数组 输出的时候先提示输出再显示结果 输出的时候字符间间隔一个空格符
  • ¥30 频率分析法分析绘制奈奎斯特图、波特图
  • ¥15 弹出来一万个系统找不到指定的文件框框,怎么解决
  • ¥15 ADS生成的微带线为什么是蓝色空心的
  • ¥15 求一下解题思路,完全不懂
  • ¥15 tensorflow
  • ¥15 densenet网络结构中,特征以cat方式复用后是怎么进行误差回传的
  • ¥15 STM32G471芯片spi设置了8位,总是发送16位
  • ¥15 R语言并行计算beta-NTI中tree文件的类型