认证组件
一、认证介绍
只有认证通过才能访问到指定的url地址,比如增删改查的操作
二、局部使用(authentication_classes = [])
- 
models层:
class User(models.Model): name = models.CharField(max_length=16) pwd = models.CharField(max_length=16) user_type = models.IntegerField(choices=((1, 'super_admin'), (2, 'primary_admin'), (3, 'user')),default=3) # 定义一个token class Token(models.Model): user = models.OneToOneField(to='User') token = models.CharField(max_length=32) - 
新建的认证文件:返回一个元组(user,token)
 
class MyAuth(BaseAuthentication):
    # 返回一个元组(user,token)
    def authenticate(self, request):
        # 写一些认证逻辑
        token = request.GET.get('token')
        token_obj = models.Token.objects.filter(token=token).first()
        print(token_obj)
        if token_obj:
            # 对象存在标识登录成功
            return token_obj.user,token_obj.token
        else:
            # 对象不存在抛出错误信息
            raise AuthenticationFailed('没有登录')
- 视图层
 
# 查看数据接口:需要经过认证
class Books(APIView):
	# 局部认证
    authentication_classes = [MyAuth,]
    permission_classes = [Mypermision,]
    def get(self,request):
        return Response('返回了所有书籍')
# 登录接口:
class Login(APIView):
    authentication_classes = []
    def post(self, request):
        back_dic = {
            'code': 100,
            'msg': '登录成功'
        }
        user = request.data.get('name')
        print(user)
        pwd = request.data.get('pwd')
        print(pwd)
        try:
            user_obj = models.User.objects.filter(name=user, pwd=pwd).get()
            # 登录成功,生成一个token的值
            token = uuid.uuid4()
            models.Token.objects.update_or_create(user=user_obj, defaults={'token': token})
            back_dic['token'] = token
        except ObjectDoesNotExist as e:
            back_dic['code'] = 101
            back_dic['msg'] = '用户名或者密码错误'
        except Exception as e:
            back_dic['code'] = 102
            back_dic['msg'] = str(e)
        return Response(back_dic)
三、全局使用
- 
需要在setting 中配置
REST_FARMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ["app01.myauth.MyAuth"] } - 
局部禁用:authentication_classes = []登录接口:
class Login(APIView):
authentication_classes = []def post(self, request): back_dic = { 'code': 100, 'msg': '登录成功' } 
四、读源码





配置文件写法

五、总结
- 
写一个认证类,继承BaseAuthentication
class MyAuth(BaseAuthentication): def authenticate(self,request): #写一些认证的逻辑 # print('我是认证类中的方法,只要配置了,一定会走我') token=request.GET.get('token') token_obj=models.Token.objects.filter(token=token).first() if token_obj: #有值表示登录了 #token_obj.user 当前登录的user对象 return token_obj.user,token_obj else: #没有值,表示没有登录,抛异常 raise AuthenticationFailed('您没有登录') - 
局部使用
- 
在视图类中写
authentication_classes=[MyAuth,] 
 - 
 - 
全局使用
- 
在settings.py中配置
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",] } 
 - 
 - 
局部禁用
- 
在视图类中写
authentication_classes = [] 
 - 
 
                    
                
                
            
        
浙公网安备 33010602011771号