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 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码