DRF认证组件

认证组件

一、认证介绍

只有认证通过才能访问到指定的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 = []
      
原文地址:https://www.cnblogs.com/king-home/p/11129938.html