DjangoRestFramework【DRF授权】

详细方法参考Django官方授权API

1.全局权限

setting中配置授权管理,这个授权是全局的,对于每一个视图都生效

REST_FRAMEWORK = {
    # 全局配置 优先级高于视图类中的配置
    # 默认权限配置:每一个http方法都可以有对应的权限配置
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]

    # 修改权限管理 必须授权才可以使用
    # 'DEFAULT_PERMISSION_CLASSES': [
    #     'rest_framework.permissions.IsAuthenticated',
    # ]

}

2. 视图级别权限

2.1 给所有功能授权同样权限

shop.viess.py代码

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, IsAdminUser

from shop.models import Category, Goods
from shop.serializers import CategorySerializer, GoodsSerializer


class CategoryViewSets(viewsets.ModelViewSet):
    """
    分类视图:
    继承ModelViewSet之后拥有GET POST PUT PATCH DELETE等HTTP动词操作
    serilizer_class 指明序列化类
    """
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

    # 用户未登入不显示 分类列表 优先级高于全局配置,第一参数是管理员可以查看,第二个参数是授权可以查看
    permission_classes = [IsAdminUser,IsAuthenticated]

没有授权的时候的显示:
在这里插入图片描述
在Apifox或者postman中使用管理员账户登入测试
选择BasicAuth,使用管理员账户登入之后就可以查询到结果
在这里插入图片描述

2.2.根据不同身份对同一个视图设置不同的权限

需求:超级管理员可以创建分类 普通用户可以查看分类
shop.view.py代码:

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, IsAdminUser

from shop.models import Category, Goods
from shop.serializers import CategorySerializer, GoodsSerializer


class CategoryViewSets(viewsets.ModelViewSet):
    """
    分类视图:
    继承ModelViewSet之后拥有GET POST PUT PATCH DELETE等HTTP动词操作
    serilizer_class 指明序列化类
    """
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

    # 用户未登入不显示 分类列表 优先级高于全局配置
    # permission_classes = [IsAdminUser,IsAuthenticated]

    # 需求:超级管理员可以创建分类 普通用户可以查看分类
    def get_permissions(self):
        if self.action == "create" or self.action == "update" or self.action == "partial_update" or self.action == "destroy":
            return [IsAdminUser()]
        else:
            return []

效果演示,使用普通用户登入,然后添加商品分类:
就会报错没有权限进行添加操作
在这里插入图片描述

2.3.自定义权限

在子app下面创建一个权限类shop.permission.py

"""
自定义权限
"""
from rest_framework import permissions

class CategorysPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        # 重写has_permission方法
        # 如果返回Ture所有权限都有,如果返回False所有权限都没有
        return False

views.py中引用这个自定义视图类

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, IsAdminUser

from shop import permissions
from shop.models import Category, Goods
from shop.serializers import CategorySerializer, GoodsSerializer


class CategoryViewSets(viewsets.ModelViewSet):
    """
    分类视图:
    继承ModelViewSet之后拥有GET POST PUT PATCH DELETE等HTTP动词操作
    serilizer_class 指明序列化类
    """
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

    # 用户未登入不显示 分类列表 优先级高于全局配置
    # permission_classes = [IsAdminUser,IsAuthenticated]

    # 需求:超级管理员可以创建分类 普通用户可以查看分类
    def get_permissions(self):
        if self.action == "create" or self.action == "update" or self.action == "partial_update" or self.action == "destroy":
            return [permissions.CategorysPermission()]
        else:
            return []

3.模型级别权限

在有的项目中,有的用户只能对自己创建的数据进行修改,其他人对其就不能进行修改,因此就需要使用到模型级别的权限管理.例如一个订单,只有创建该订单的用户能对其进行修改.
models代码:

# 创建订单对象
class Order(models.Model):
    """简单模拟 一个订单只有一个商品 也没有数量"""
    user=models.ForeignKey(User,on_delete=models.CASCADE,verbose_name="用户")
    goods=models.ManyToManyField(Goods,verbose_name="商品")

    def __str__(self):
        return  self.user.username

permissions.py代码:

class OrdersPermission(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        # print(obj,"++",request.user)
        # print(obj.user==request.user) 判断当前用户是否是这个订单的创建者
        return obj.user==request.user

views代码:

class OrderViewSets(viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

    # permission_classes = [permissions.OrdersPermission]

    def get_permissions(self):
        print("http方法为",self.action)
        if self.action=="create":
            # 在创建订单的时候判断用户是否登入
            return[permissions.IsAuthenticated()]
        elif self.action=="update" or self.action=="partial_update"or self.action=="retrieve":
            # 在更新订单的时候,要需要判断是否是这个用户创建的订单
            return[permissions.OrdersPermission()]
        else:
            # 超级管理员可以查看list
            return[permissions.IsAdminUser]

此时在修改订单的时候,只能由创建此订单的用户才可以进行修改.

4.http请求-混合类关键字-action对照表

http方法混合类关键字action关键字
GET列表Listget
Post 创建对象Createcreate
GET 单个对象Retrieveretrieve
PUT 修改对象提供全属性Updateupdate
PATHC 修改对象提供部分属性Updatepartial_update
DELETE 删除对象Destorydestory
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值