zoukankan      html  css  js  c++  java
  • 路飞学城项目-登陆认证模块

     

    ###############     注册接口   ################

    ##################    注册逻辑分析      ############################
    # 前端:
    # 1,前端,传过来用户名和密码,前端可以传很多东西,比如头像职业等等,
    # 后端,
    # 1,url,
    # 2,view,register类,
    # 3,model,
    # 4,serializers
    
    ##################    register类      ############################
    # 1,获取用户名和密码,
    # 2,拿序列化器进行验证,
    # 3,注册成功之后,保存数据到数据库,返回注册成功,是否需要返回用户名等其他信息,看前端的需要
    
    ##################    序列化器的逻辑      ############################
    # 1,需要重写create方法,就是save的时候调用的方法,因为需要对传过来的pwd进行加密,所以需要重写,
    
    ##################    表模型分析:      ############################
    # 注册有用户名,密码,token,创建token的时间,
    # 注意:
    # 1,传输过程中密码需要加密,如何加密?md5如何加密?
    # 2,如何实现7天免登录?
    class Register(APIView):
        def post(self,request):
            ser_obj = UserInfoSerializers(data=request.data)
            if ser_obj.is_valid():
                ser_obj.save()
                return Response('注册成功')
            else:
                return Response(ser_obj.errors)

    ###############     登陆接口  ################

    ##################    登陆逻辑分析      ############################
    # 前端:
    # 1,前端,传过来用户名和密码
    # 后端,
    # 1,url,
    # 2,view,login类,
    # 3,model,
    # 4,serializers
    
    ##################    login类      ############################
    # 1,获取用户名和密码,
    # 2,判断有没有这个用户对象,
    # 3,如果有生成token值,
    # 4,返回登陆成功或者失败的信息
    # 注意:
    # 写代码一定要try,这是一个编码习惯,防止你的代码崩
    
    ##################    BaseException类      ############################
    # 1,继承object,
    # 2,使用装饰器把方法变成属性,
    # 3,初始化的时候定义属性
    class Login(APIView):
    
        def post(self,request):
            ret = BaseException()
            username = request.data.get('username','')
            if not username:
                ret.code=1001
                ret.error='用户名不能为空'
            pwd = request.data.get('pwd','')
            if not pwd:
                ret.code=1002
                ret.error='密码不能为空'
            try:
                user_obj = UserInfo.objects.filter(username=username,pwd=pwd).first()
                if not user_obj:
                    ret.code =1003
                    ret.error= '用户或密码错误'
                user_obj.token= uuid.uuid4()
                user_obj.save()
                ret.data='登陆成功'
            except Exception as e :
                ret.code = 1004
                ret.error ='登陆失败'
            return Response(ret.dict)

    ###############     认证  ################

    ##################    认证逻辑分析      ############################
    # 前端
    # 1,访问其他页面需要携带token,
    # 2,前端可以戴在header里面,
    # 后端:
    # 1,获取到前端传过来的token,这个值可能是放在header里面传过来,也可以是放到url里面传过来,
    # 2,判断是否有这个token
    # 3,判断token是否过期,过期了是不能登录了,做一个校验,这就是七天免登录,
    # 4,返回一个元组,
    class TokenAuth(BaseAuthentication):
        def authenticate(self, request):
            # 获取前端传过来的token,放在了header里面
            # print(request.META)
            token = request.META.get('HTTP_AUTHENTICATE','')
            print(token)
            if not token:
                raise AuthenticationFailed({"code":1001,"error":"没有携带token"})
            # 判断token是否存在
            user_obj=UserInfo.objects.filter(token=token).first()
            print(user_obj)
            if not user_obj:
                raise AuthenticationFailed({"code":1002,"error":"token不合法"})
            # 判断是否过期
            old_time = user_obj.create_token_time
            now_time = now()
            print((old_time-now_time).days)
            if (now_time-old_time).days > 7:
                raise AuthenticationFailed({"code":1003,"error":"token过期"})
    
            return (user_obj,token)

    ###############    需求    ################

    登陆和认证,
    每一个接口必须要登陆了才可以访问,
    使用token进行登陆认证,和接口访问,
    
    对认证又有了新的认识,权限,频率这三个组件的用法一样,
    需要细细体会,

    ###############    表结构    ################

    class UserInfo(models.Model):
        user = models.CharField(max_length=32)
        pwd = models.CharField(max_length=64)
    
    class UserToken(models.Model):
        user = models.OneToOneField(to="UserInfo")
        token = models.CharField(max_length=64)

    ###############    登陆认证    ################

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from django.shortcuts import HttpResponse
    from api import models
    import uuid
    
    
    class AuthView(APIView):
    
        def post(self,request,*args,**kwargs):
            """
            用户登录认证
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
    
            ret = {'code':1000}
            user = request.data.get('user')
            pwd = request.data.get('pwd')
    
            user = models.UserInfo.objects.filter(user=user,pwd=pwd).first()
            if not user:
                ret['code'] = 1001
                ret['error'] = '用户名或密码错误'
            else:
                uid = str(uuid.uuid4())
                models.UserToken.objects.update_or_create(user=user,defaults={'token':uid})
                ret['token'] = uid
            return Response(ret)

    ###############    访问接口的认证类    ################

    from rest_framework.authentication import BaseAuthentication
    from rest_framework.exceptions import AuthenticationFailed
    from api import models
    
    class LuffyAuth(BaseAuthentication):
    
        def authenticate(self, request):
            """
            认证,需要获取前端传递的token,并且校验是否存在,
            :param request:
            :return:
            """
            token = request.query_params.get('token')
            obj = models.UserToken.objects.filter(token=token).first()
            if not obj:
                raise AuthenticationFailed({'code':1001,'error':'认证失败'})
            return (obj.user.user,obj)  # 认证成功返回一个元组,

    ###############    视图认证举例    ################

    class MicroView(APIView):
        # 认证
        authentication_classes = [LuffyAuth,]
    
        def get(self,request,*args,**kwargs):
            ret = {'code':1000,'title':'微职位'}
            return Response(ret)

    ###############    表结构    ################

  • 相关阅读:
    JVM精进之路
    Java8-java.time-常用API
    Java代码精进
    Java8——jdk——java.time包
    Java8——Optional
    Java8——Stream
    Java8——Lambda表达式
    Java高级-反射
    重新学习SpringMVC——补充
    LeetCode677. 键值映射(相关话题:Trie前缀树)
  • 原文地址:https://www.cnblogs.com/andy0816/p/12302022.html
Copyright © 2011-2022 走看看