美文网首页Django入门开发实战
Rest-Framework之认证组件

Rest-Framework之认证组件

作者: 乔治大叔 | 来源:发表于2019-03-04 22:41 被阅读82次

只有认证通过的用户才能访问指定的url地址,比如:查询数据信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件

全局使用

REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
}

局部使用

局部使用,只需要在视图类里加入:authentication_classes = [TokenAuth, ]

(1)models层:

class User(models.Model):
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=32)
    user_type=models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'管理员用户')))

class UserToken(models.Model):
    user=models.OneToOneField(to='User')
    token=models.CharField(max_length=64)

(2)新建认证类(验证通过return两个参数)

from rest_framework.authentication import BaseAuthentication
class TokenAuth():
    def authenticate(self, request):
        token = request.GET.get('token')
        token_obj = models.UserToken.objects.filter(token=token).first()
        if token_obj:
            return
        else:
            raise AuthenticationFailed('认证失败')
    def authenticate_header(self,request):
        pass

(3)view层

def get_random(name):
    import hashlib
    import time
    md=hashlib.md5()
    md.update(bytes(str(time.time()),encoding='utf-8'))
    md.update(bytes(name,encoding='utf-8'))
    return md.hexdigest()
class Login(APIView):
    def post(self,reuquest):
        back_msg={'status':1001,'msg':None}
        try:
            name=reuquest.data.get('name')
            pwd=reuquest.data.get('pwd')
            user=models.User.objects.filter(username=name,password=pwd).first()
            if user:
                token=get_random(name)
                models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
                back_msg['status']='1000'
                back_msg['msg']='登录成功'
                back_msg['token']=token
            else:
                back_msg['msg'] = '用户名或密码错误'
        except Exception as e:
            back_msg['msg']=str(e)
        return Response(back_msg)



class Course(APIView):
    authentication_classes = [TokenAuth, ]

    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return HttpResponse('post')
当访问量过大时,对数据库的压力比较大,后期迭代中根据源码改写,不存数据库的token验证
def get_token(id,salt='123'):
    import hashlib
    md=hashlib.md5()
    md.update(bytes(str(id),encoding='utf-8'))
    md.update(bytes(salt,encoding='utf-8'))

    return md.hexdigest()+'|'+str(id)

def check_token(token,salt='123'):
    ll=token.split('|')
    import hashlib
    md=hashlib.md5()
    md.update(bytes(ll[-1],encoding='utf-8'))
    md.update(bytes(salt,encoding='utf-8'))
    if ll[0]==md.hexdigest():
        return True
    else:
        return False

class TokenAuth():
    def authenticate(self, request):
        token = request.GET.get('token')
        success=check_token(token)
        if success:
            return
        else:
            raise AuthenticationFailed('认证失败')
    def authenticate_header(self,request):
        pass
class Login(APIView):
    def post(self,reuquest):
        back_msg={'status':1001,'msg':None}
        try:
            name=reuquest.data.get('name')
            pwd=reuquest.data.get('pwd')
            user=models.User.objects.filter(username=name,password=pwd).first()
            if user:
                token=get_token(user.pk)
                # models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
                back_msg['status']='1000'
                back_msg['msg']='登录成功'
                back_msg['token']=token
            else:
                back_msg['msg'] = '用户名或密码错误'
        except Exception as e:
            back_msg['msg']=str(e)
        return Response(back_msg)
from rest_framework.authentication import BaseAuthentication
class TokenAuth():
    def authenticate(self, request):
        token = request.GET.get('token')
        token_obj = models.UserToken.objects.filter(token=token).first()
        if token_obj:
            return
        else:
            raise AuthenticationFailed('认证失败')
    def authenticate_header(self,request):
        pass

class Course(APIView):
    authentication_classes = [TokenAuth, ]

    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return HttpResponse('post')

相关文章

  • 23_rest-framework认证组件

    rest-framework认证组件 一、认证简介 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息...

  • Rest-Framework之认证组件

    只有认证通过的用户才能访问指定的url地址,比如:查询数据信息,需要登录之后才能查看,没有登录,就不能查看,这时候...

  • Rest-Framework之认证组件

    只有认证通过的用户才能访问指定的url地址,比如:查询数据信息,需要登录之后才能查看,没有登录,就不能查看,这时候...

  • 22_rest-framework的序列化组件

    序列化组件 rest-framework序列化之serializers 其他详细操作 简单使用: models.p...

  • rest_framework之序列化

    目录 rest-framework序列化之Serializer rest-framework序列化之ModelSe...

  • Rest-Framework之权限组件

    所谓的权限就是只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制。 一、局部使用 局部使...

  • Rest-Framework之频率组件

    用频率组件是为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 自定义频率类,自定义频率规则 自定...

  • Rest-Framework之权限组件

    所谓的权限就是只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制。 一、局部使用 局部使...

  • Rest-Framework之频率组件

    用频率组件是为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 自定义频率类,自定义频率规则 自定...

  • Rest-Framework之视图组件

    一 基本视图 写一个出版社的增删查改resful接口 路由: 视图: 二 mixin类和generice类编写视图...

网友评论

    本文标题:Rest-Framework之认证组件

    本文链接:https://www.haomeiwen.com/subject/wmawuqtx.html