详细方法参考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列表 | List | get |
Post 创建对象 | Create | create |
GET 单个对象 | Retrieve | retrieve |
PUT 修改对象提供全属性 | Update | update |
PATHC 修改对象提供部分属性 | Update | partial_update |
DELETE 删除对象 | Destory | destory |