zoukankan      html  css  js  c++  java
  • 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 = []
        
  • 相关阅读:
    线上幽灵:世界头号黑客米特尼克自传(体验头号黑客传奇人生,洞悉头号黑客思维模式!启明,绿盟,安天,安全宝,百度,腾讯,阿里……众安全专家一致推荐!)
    python+selenium环境搭建
    显示器尺寸和分辨率大小
    jQuery的get()post()getJson()方法
    python发送邮件
    python学习笔记之——正则表达式
    linux上查找文件存放地点和文件中查找字符串方法
    各种协议类型
    HTTP状态码、请求方法、响应头信息
    CSS选择器
  • 原文地址:https://www.cnblogs.com/king-home/p/11129938.html
Copyright © 2011-2022 走看看