首页 > 其他 > 详细

django_restfreamwork 5 权限组件

时间:2020-08-21 20:46:57      阅读:56      评论:0      收藏:0      [点我收藏+]

DRF【权限组件】

默认权限组件

如果让有些接口/页面,必须登录才能看,那么默认权限就可以,要么有权限,要么没有权限

默认写好的视图

只需要新增 IsAuthenticated ,那么前端请求过来必须携带token(比如已经登录)进行验证,才会返回想要的数据

在接口的视图类中定义 permission_classes = [IsAuthenticated, ]

# from .models import Book
# from rest_framework.views import APIView
# from rest_framework.response import Response
# from .serializers import BookSerializer
from rest_framework.permissions import IsAuthenticated
# 
# class BookView(APIView):
    permission_classes = [IsAuthenticated, ]    #登录认证,如果没有携带token请求会返回没有登录
# 
#     def get(self, request):
#         book_list = Book.objects.all()
#         ret = BookSerializer(book_list, many=True)
#         return Response(ret.data)

序列化器忽略

测试携带token请求

需要向 127.0.0.1:8000/books/list 发送 get 请求

header头部

get请求的 header 头部 必须为 key为 Authorization ,value为 jwt ${token} (注意,jwt后面带一个空格)

{
  "Authorization": "jwt ${token}"
}

请求参数 : 如果后端需要请求参数则携带,如果不需要请求参数,则不用携带参数 发送请求

技术分享图片

自定义权限组件

在能登录才能 访问 接口/页面的同时,还能让用户登录后,用户权限权重够不够资格看 某些特定的接口/页面

通过继承 BasePermission 类的 has_permission 方法来实现自定义权限

用户表新增字段

涉及到权限的分层,需要定义每个用户的权限等级,方便根据这个字段type,进行细分管理

user/models.py

# from django.db import models
# from django.contrib.auth.models import AbstractUser
# class User(AbstractUser):
#     """用户模型类"""
#     # 如果手机设置 IntegerField的话,只有10位数字,并且有正有负
#     # 手机号不需要计算,所以不需要设置int类型,设置字符串即可
#     mobile = models.CharField(max_length=15, unique=True, verbose_name=‘手机号‘)
#     avatar = models.ImageField(upload_to="avator",null=True,blank=True,verbose_name="用户头像")
    type = models.IntegerField(choices=((1,‘外包‘),(2,‘正式员工‘),(3,‘经理‘)),default=1,verbose_name="权限级别")
#     class Meta:
#         db_table = ‘users‘
#         verbose_name = ‘用户‘
#         verbose_name_plural = verbose_name

数据库迁移

python3 manage.py makemigrations
python3 manage.py migrate

自定义权限认证

新建user/permission.py

里面定义了 type是1的级别的人,返回False,无法访问

from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
    """
        自定义权限,可以让权限再次细分
        message 不能改名,因为调用父类中,报异常需要通过 反射的方式调用 message
    """
    message = "权限不足"    #如果权限不足,定义返回异常信息的内容

    def has_permission(self, request, view):
        """重写父类的方法"""
        user_obj = request.user
        if user_obj.type == 1:  # 定义外包不能访问
            return False
        else:                   # 除了级别 type是1的外包之外的人,都能访问
            return True

对视图的指定接口进行权限控制

导入自定义权限的方法,在 permission_classes 中引入自定义的权限,进行验证

# from .models import Book
# from rest_framework.views import APIView
# from rest_framework.response import Response
# from .serializers import BookSerializer
# from rest_framework.permissions import IsAuthenticated
from user.permission import MyPermission
# class BookView(APIView):
    permission_classes = [MyPermission, ]    #登录认证,如果没有携带token请求会返回没有登录
# 
#     def get(self, request):
#         book_list = Book.objects.all()
#         ret = BookSerializer(book_list, many=True)
#         return Response(ret.data)

测试细分权限控制

当user新增type字段时,默认为1,在自定义权限控制中定义如果type为1,则不通过

所以get方法 携带头部信息的token请求 http://0.0.0.0:8000/books/list 接口,显示 刚才自定义的 message 内容"没有权限"

技术分享图片

当这个用户的字段type修改为2的时候,则可以访问

技术分享图片

django_restfreamwork 5 权限组件

原文:https://www.cnblogs.com/wyzerg/p/13542889.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!