rest-framework实现用户认证

一、创建数据模型

  • 1、创建一个用户表

    class UserModel(models.Model):
        """
        创建一个用户表
        """
        user_type_choices = (
            (1, '普通用户'),
            (2, 'VIP用户')
        )
        user_type = models.IntegerField(choices=user_type_choices, null=False, verbose_name='用户类型')
        username = models.CharField(max_length=100, null=False, verbose_name='用户名')
        password = models.CharField(max_length=100, null=False, verbose_name='密码')
    
  • 2、创建token

    class UserTokenModel(models.Model):
        """
        创建一个用户token表
        """
        user = models.OneToOneField(to='UserModel', on_delete=models.CASCADE)
        token = models.CharField(max_length=100, verbose_name='用户token')
    
  • 3、生成表

  • 4、手动插入两条数据

二、原生的用户登录拦截(和第四章的session差不多)

  • 1、进行token认证

    class OrderView(APIView):
        def get(self, request, *args, **kwargs):
            res = {'code': 0, 'message': 'success'}
            token = request.GET.get('token', None)
            if token and models.UserTokenModel.objects.filter(token=token).first():
                try:
                    res['data'] = {'name': '哈哈'}
                except Exception as e:
                    print(e)
            else:
                res['code'] = 1
                res['message'] = '失败'
            return JsonResponse(res)
    

三、局部使用rest-framework的认证模块

  • 1、导包

    from rest_framework.authentication import BasicAuthentication
    from rest_framework import exceptions
    
  • 2、认证类

    class Authentication(BasicAuthentication):
        def authenticate(self, request):
            token = request.GET.get('token', None)
            token_obj = models.UserTokenModel.objects.filter(token=token).first()
            if not token_obj:
                raise exceptions.AuthenticationFailed('用户认证失败')
            return (token_obj.user, token_obj)
    
  • 3、使用认证类(在需要认证的视图中写上)

    class OrderView(APIView):
        authentication_classes = [Authentication]
    
        def get(self, request, *args, **kwargs):
            # 因为上面认证类中返回了,这里可以直接获取到
            print(request.user.username)
            print(request.auth)
            res = {'code': 1, 'message': '失败', 'data': None}
            try:
                res['data'] = {'name': '哈哈'}
            except Exception as e:
                print(e)
            return JsonResponse(res)
    
  • 4、总结:

    • 1.上面认证类中返回的用户相关信息,我们可以在别的请求中直接在request中取到
    • 2.可以在需要限制访问的接口中加上这个类,来限制登录访问

四、全局注册

  • 1、说明:类似函数的作用域一样的,如果局部有就用局部的,如果局部没有就用全局的

  • 2、把刚刚定义的认证类单独定义到一个包下面

  • 3、在settings.py中使用restframework的配置

      REST_FRAMEWORK = {
          'DEFAULT_AUTHENTICATION_CLASSES': ['你定义认证类的路径']
      }
    
  • 4、你局部可以不需要配置了,如果配置就使用局部的认证类
  • 5、在全局上配置了认证,但是有些接口不需要认证的时候就在接口视图中写上一个空的列表

      class OrderView(APIView):
          authentication_classes = []
    
          def get(self, request, *args, **kwargs):
              pass
    

五、未认证身份的配置

  • 1、可以使用 UNAUTHENTICATED_USER 设置修改未经身份验证的请求的 request.user 的值
  • 2、可以使用 UNAUTHENTICATED_TOKEN 设置修改未经身份验证的请求的request.auth 的值
  • 3、在settings.py中配置

      REST_FRAMEWORK = {
          'DEFAULT_AUTHENTICATION_CLASSES': ['你定义认证类的路径'],
          'UNAUTHENTICATED_USER': None,
          'UNAUTHENTICATED_TOKEN': None,
      }
    

results matching ""

    No results matching ""