drf——drf自定义认证类,自定义权限功能及使用

 

#注意: 认证-->权限-->频率   第一步认证没经过的话就不会到权限,权限没经过就不会到频率

1、自定义认证类

1 使用
    -定义一个类,继承BaseAuthentication
    class LoginAuth(BaseAuthentication):
        def authenticate(self, request):
            token = request.GET.get('token')
            res = models.UserToken.objects.filter(token=token).first()
            if res:
                return 元组
            else:
                raise AuthenticationFailed('您没有登陆')
    -重写authenticate方法
    -局部使用和全局使用
        -局部:在视图类中配置(只要配置了,就是登陆之后才能访问,没配置,不用登陆就能访问)
            authentication_classes = [MyAuthen.LoginAuth, ]
        -全局
        REST_FRAMEWORK = {
        "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ]
        }
        
   -注意:
    1 认证类,认证经过能够返回一个元组,有两个值,第一个值会给,request.user,第二个值会个request.auth
    2 认证类能够配置多个,按照从前向后的顺序执行,若是前面有返回值,认证就再也不继续往下走了
    3 get请求携带token:-放在请求头里: url/?token=xxxxxxxxxx  -----放在头里要用Meta来取
                -放在body体参数中: key:token value:xxxxxxxx

2、认证功能局部使用和全局使用

1 全局使用(全部接口,都须要登陆才能访问)
    -在配置文件中
        REST_FRAMEWORK = {
        "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ]
        }
2 局部使用
    -在想局部使用的视图类上
    authentication_classes = [MyAuthen.LoginAuth,]
3 局部禁用
    -在想禁用的视图类上
    authentication_classes = []

3、自定义权限功能

1 登陆成功之后,超级用户能够干某些事,普通用户不能干---》超级用户能够查看某些接口,普通用户不能查看

2 使用
   -写一个类继承BasePermission,重写has_permission
    class SuperPermission(BasePermission):
        def has_permission(self, request, view):
            # Return `True` if permission is granted, `False` otherwise.
            # 超级用户能够访问,除了超级用户之外,都不能访问
            if request.user.user_type == '1':
                return True
            else:
                return False
            
3 局部使用和全局使用
    -在想局部使用的视图类上
    permission_classes = [MyAuthen.SuperPermission]
    -全局使用
      REST_FRAMEWORK = {
        "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ]
        }
     -局部禁用
    permission_classes = []

4、权限功能局部使用和全局使用

1 使用方式
    -在想局部使用的视图类上
    permission_classes = [MyAuthen.SuperPermission]
    -全局使用
      REST_FRAMEWORK = {
        "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ]
        }
     -局部禁用
    permission_classes = []

5、内置的权限和认证类

# 内置认证类
from rest_framework.exceptions import AuthenticationFailed
# 内置权限类
from rest_framework.permissions import BasePermission