是不是使用了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_CLASSES
和DEFAULT_PERMISSION_CLASSES
来指定需要使用哪些配置类。但是请注意,权限验证和身份验证是两个不同的概念。身份验证通常用于验证用户是否已登录,而权限验证用于验证用户是否具有执行特定操作所需的权限。在使用DRF和SimpleJWT进行身份验证时,由于JWT令牌已经包含了用户信息,所以直接通过
request.user
获取。因此,使用permission_required
进行权限验证时可能会失败,因为它的实现方式需要从session或cookie中获取用户id或其他信息,而不是从JWT令牌中获取。解决方案是使用DRF提供的
permission_classes
来指定你自己的权限验证类,比如IsAuthenticated
和IsAdminUser
等。下面是一个简单的示例代码: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_CLASSES
和DEFAULT_PERMISSION_CLASSES
。例如:REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
以上配置将使用SimpleJWT进行验证,并将DRF提供的
IsAuthenticated
权限类分配给所有视图。如果你需要更高级的权限验证功能,如基于角色的访问控制(RBAC),可以使用第三方库,如django-guardian
或django-rules
等。希望这个答案可以解决你的问题。
如果我的回答解决了您的问题,请采纳!本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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代码