DRF框架之认证组件用法(第四天)

1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的

2.如何实现认证呢?

from rest_framework.authentication import BaseAuthentication
from app01 import models
from rest_framework.exceptions import AuthenticationFailed
class MyAuthetication(BaseAuthentication):
    #重写这个方法
    def authenticate(self,request):
        #认证相关的东西

        #如果token信息放到请求头中,如何取?
        # request._request.META
        # token=request.META.get('token')

        # 校验该次请求是否携带正确的token
        #取出token
        token=request.GET.get('token')
        #校验该次请求是否携带正确的token
        ret=models.UserToken.objects.filter(token=token).first()
        if ret:
            #正常通过认证的用户
            #ret.user 当前登录用户
            return ret.user,token
            # return None
        else:
            #没有登录或者非法用户
            raise AuthenticationFailed('您没有通过认证')
判断用户登录携带的token是否正确

3. 如何在登录的时候加载认证信息处理是否是正常的用户

#写登录接口
class Login(APIView):
    #全局使用的局部禁用
    authentication_classes = []
    def post(self,request):
        response={'status':100,'msg':None}
        name=request.data.get('name')
        pwd=request.data.get('pwd')
        #去数据库校验该用户是否存在
        user=models.User.objects.filter(name=name,pwd=pwd).first()
        if user:
            #正常用户登录成功
            #返回一个唯一的随机字符串
            token=uuid.uuid4()
            #把生成的随机字符串存到数据库中
            # 这样不行,因为每次登录都会新插入一条
            # models.UserToken.objects.create(user=user,token=token)
            # 先去数据库中查询,如果当前用户存在记录,更新token,如果不存在,新增一条
            # 根据user取查询,如果查到数据,更新defaults中的数据,如果查不到,新增一条数据
            ret=models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
            response['msg']='登录成功'
            response['token']=token
        else:
            #用户名或密码错误
            response['status'] = 101
            response['msg'] = '用户名或密码错误'
        return Response(response)
简单的登录加载认证处理

4. 如何全局使用呢?

# 认证的全局配置
REST_FRAMEWORK={
    'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',],

}

5. 如何全局禁用,局部使用呢?

#写登录接口
class Login(APIView):
    #全局使用的局部禁用
    authentication_classes = [MyAuthetication]
    def post(self,request):

猜你喜欢

转载自www.cnblogs.com/gukai/p/10780606.html