【1125 | Day65】drf认证、权限组件

一、基本知识

1. 该三个组件阅读源码的方式和版本源码阅读步骤类似

详细阅读版本源码https://www.cnblogs.com/yingjp/p/10606698.html

2. 进入initial可以看到以下方法

#认证执行的方法:校验用户(游客,合法用户,非法用户)
self.perform_authentication(request)
#权限执行的方法:校验用户权限,必须登录,所有用户登录读写,游客只读,自定义用户角色
self.check_permissions(request)
#频率执行的方法:限制视图接口被访问的频率次数
self.check_throttles(request)

3. 进一步对上述的方法进行阅读我们能得出以下几点

a:在settings中应该怎样配置

b:自定义组件需要实现什么方法

c:方法的返回值

d:对应的属性取值的方法 

4. 对认证,权限,频率这三个逐渐学习步骤

​ a:用rest_framework给我们提供的模块进行定制

​ b:自己定义组件

5. 认证、权限、频率的工作原理

​ a:基于哪个类、重写哪个方法、方法的实现体要完成什么事

二、认证组件

1. 阅读源码结论

​ a:认证类需要继承BaseAuthentication类

​ b:需要实现authenticate(self, request)方法

​ c:返回一个长度为2的元祖

​ d:settings可以通过DEFAULT_AUTHENTICATION_CLASSES配置全局验证

2. 自定义认证类(配置全局认证)

​ a:先写一个认证类

from  rest_framework.authentication import BaseAuthentication
from testDemo.models import UserInfo
from rest_framework.exceptions import AuthenticationFailed
 
'''
这里是写的token是存在url中
  1:需要继承BaseAuthentication
  2:需要重写authenticate()方法
  3:返回一个元祖
'''
 
class  MyAuth(BaseAuthentication):
    #自定义token在url中
    def authenticate(self, request):
        token = request.query_params.get('token','')
        user=UserInfo.objects.filter(token=token).first()
        if not user:
            raise AuthenticationFailed('token 信息不合理')
 
        return (user,token)

b:settings注册

​ --所有的视图函数都会进行认证,其实还不是很必要(局部认证下面介绍)

REST_FRAMEWORK={
    #认证注册
    'DEFAULT_AUTHENTICATION_CLASSES':['utils.auth.MyAuth',],
}

3. 使用rest_framework提供的认证组件进行认证。

认证组件一般都是自己写的,这里介绍自定义组件只是了解,学习视图函数的局部认证。

a:通过BaseAuthentication这个认证的基类,点进去就能看见所有认证类,使用方式和自定义的认证类一样

img

b:局部视图的认证,在需要认证的视图处添加authentication_classes=[authclass1,authclass2]

from utils.auth import MyAuth
# Create your views here.
from rest_framework.views import APIView,Response
import uuid
from testDemo.models import UserInfo
# Create your models here.
class authDemo(APIView):
    authentication_classes = [MyAuth, ]
    def get(self, request):
        print(request.user)
        print(request.auth)
        return Response('测试代码')  

三、权限组件

1. 阅读代码结论

​ a:settings全局配置key'DEFAULT_PERMISSION_CLASSES'

​ b:视图函数局部配置参数permission_classes

​ c:权限类需要继承的类from rest_framework.permissions import BasePermission

​ d:需要重写的方法has_permission(self, request, view)

2. 自定义权限类

from rest_framework.permissions import BasePermission
 
class MyPermissions(BasePermission):
    def has_permission(self, request, view):
        #登陆成功后登陆信息,存在request.user中
        user_obj =request.user
        #type ==3 普通用户没有该权限
        if user_obj.type ==3:
            return False
        return True

3. 权限配置

参考第一条。

原文地址:https://www.cnblogs.com/fxyadela/p/11930181.html