zoukankan      html  css  js  c++  java
  • RestFramework之认证组件

    一、认证组件的介绍

      对于认证,我们一般有三种方式,即cookie, session,token,

    1. cookie,是将信息存放在客户端(浏览器上),信息不安全;
    2. session,把信息放在服务器数据库中,但是要是信息量较大,对服务器的压力就会大大增加;
    3. token采用每次用户登陆后为其设置一个随机字符串,即token值,用户登陆之后,每次访问都带着这个token来访问,服务端只需要验证token值是否正确就可以,相对比较方便使用;

      所以,我们使用token做认证;

    二、认证组件的使用

      首先需要编写模型类这里已经准备好了,主要是需要user表与token表。

    class User(models.Model):
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        level = (
            (1, 'delux'),
            (2, 'vip'),
            (3, 'svip')
        )
        user_level = models.IntegerField(choices=level)
    
    
    class UserToken(models.Model):
        token = models.CharField(max_length=128)
        user = models.OneToOneField('User', on_delete=models.CASCADE)

      然后需要编写登陆视图

    class Loginview(APIView):
        # parser_classes = [JSONParser, FormParser]
        def get(self, request):
            return render(request, 'login.html')
    
        def post(self, request):
            '''
            code:
                200:登陆成功
                201:用户名或密码错误
                202:其他错误
            :param request:
            :return:
            '''
            res = {'code': None, 'user': None, 'message': None}
            try:
                username = request.data.get('username')
                password = request.data.get('password')
                user_obj = User.objects.filter(username=username, password=password).first()
                if user_obj:
                    token_str = str(uuid.uuid4()).replace('-', '')
                    UserToken.objects.update_or_create(user=user_obj, defaults={'token': token_str})
                    res['code'] = '200'
                    res['user'] = username
                    res['message'] = '登陆成功'
                    res['token'] = token_str
                else:
                    res['code'] = '201'
                    res['message'] = '用户名或密码错误'
            except Exception as e:
                res['code'] = '202'
                res['message'] = e
            # print(request.data)
            # print(self.parser_classes)
            # res['succsess'] = request.data
            # res = json.dumps(res)
            return Response(res)

      准备工作做好之后我们来编写认证类,在编写之前需要导入相关的包与模型类

    from rest_framework.authentication import BaseAuthentication
    from rest_framework.exceptions import AuthenticationFailed
    from app01.models import UserToken     # model中的模型类

      开始编写认证类,

    class UserAuth(BaseAuthentication):
        def authenticate(self, request):
            # 我们模仿get请求页面
            token = request.query_params.get("token")  # 同request.GET.get("token")
            # 在token表中查找有么有这次请求携带的token值
            user_token_obj = models.UserToken.objects.filter(token=token).first()
            if user_token_obj:
                # 如果有值,说明是 正常用户
                return user_token_obj.user, user_token_obj.token
                # 返回 当前的用户对象,和当前的token值,这样源码就会帮我们赋值给request对象了,我们在后面的request中就可以使用了
            else:
                raise AuthenticationFailed("认证失败!")

      视图类中只需要加入一行代码

    authentication_classes = [UserAuth]  # 认证类

      这样我们的认证组件就完成了。

      

  • 相关阅读:
    Git在商业项目中的使用流程
    EventBus中观察者模式的应用
    作业三——安卓系统文件助手APP原型设计
    视频剪辑软件的调研——万兴神剪手、视频编辑王、爱剪辑
    18-10-31 Scrum Meeting 3
    myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)
    一个「学渣」从零开始的Web前端自学之路
    Vue一个案例引发「内容分发slot」的最全总结
    Vue CLI 3.0脚手架如何在本地配置mock数据
    Vue一个案例引发「动画」的使用总结
  • 原文地址:https://www.cnblogs.com/qq631243523/p/10098910.html
Copyright © 2011-2022 走看看