# 大家都登录了,但有的功能(接口),只有超级管理员能做,有的功能所有登录用户都能做----》这就涉及到权限的设计了
# 权限设计:比较复杂---》有acl,rbac,abac。。。
# 咱们现在只是为了先讲明白,drf的权限组件如何用,咱们先以最简单的为例
-查询所有图书:所有登录用户都能访问(普通用户和超级管理员)
-其实没有权限控制
-删除图书,只有超级管理员能访问
-给其它用户设置的权限
# 自定义权限类的使用步骤
1 写一个类,继承BasePermission
2 在类中写方法:has_permission ------->是对
-如果有权限,就返回True
-如果没有权限,就返回False
-错误信息是self.message='字符串'
3 局部使用
class BookDetailView(APIView):
permission_classes = [AdminPermission, ]
4 全局使用
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'app01.permission.AdminPermission'
],}
5 局部禁用
class BookView(APIView):
permission_classes = []6 has_permission在请求进来的时候就开始了属于DRF的三大认证,返回True就能访问,False就禁止访问
has_object_permissions是对某个对象的访问权限,默认是True可以根据request对象和obj对象判断:该对象是否可以返回给该request
请求
,返回True或者False。
调用的时机:在get_object方法中调用
7 除了
IsAuthenticatedOrReadOnly
类,DRF自带的常用权限类还包括:
IsAuthenticated
类:仅限已经通过身份验证的用户访问;AllowAny
类:允许任何用户访问;IsAdminUser
类:仅限管理员访问;IsAuthenticated类 ;认证通过
DjangoModelPermissions
类:只有在用户经过身份验证并分配了相关模型权限时,才会获得授权访问相关模型。DjangoModelPermissionsOrReadOnly
类:与前者类似,但可以给匿名用户访问API的可读权限。DjangoObjectPermissions
类:只有在用户经过身份验证并分配了相关对象权限时,才会获得授权访问相关对象。通常与django-gaurdian联用实现对象级别的权限控制。
小案例
from rest_framework.permissions import BasePermission
class AdminPermission(BasePermission):
def has_permission(self, request, view):
# 如果有权限,就是返回True,没有权限,返回False
# 判断user_type是不是 1,根据当前登录用户
# request.user # 就是当前登录用户,一旦来到这里,认证就通过了
if request.user.user_type == 1: # 一定要注意类型#####
return True
else:
# 错误信息
self.message = '您好:%s,您没有权限' % request.user.name
return False