一、认证介绍

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

二、局部使用

(1)models层:

  1. class User(models.Model):
  2. username=models.CharField(max_length=32)
  3. password=models.CharField(max_length=32)
  4. user_type=models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'二笔用户')))
  5.  
  6. class UserToken(models.Model):
  7. user=models.OneToOneField(to='User')
  8. token=models.CharField(max_length=64)

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

  1. from rest_framework.authentication import BaseAuthentication
  2. class TokenAuth():
  3. def authenticate(self, request):
  4. token = request.GET.get('token')
  5. token_obj = models.UserToken.objects.filter(token=token).first()
  6. if token_obj:
  7. return
  8. else:
  9. raise AuthenticationFailed('认证失败')
  10. def authenticate_header(self,request):
  11. pass

(3)view层

  1. def get_random(name):
  2. import hashlib
  3. import time
  4. md=hashlib.md5()
  5. md.update(bytes(str(time.time()),encoding='utf-8'))
  6. md.update(bytes(name,encoding='utf-8'))
  7. return md.hexdigest()
  8. class Login(APIView):
  9. def post(self,reuquest):
  10. back_msg={'status':1001,'msg':None}
  11. try:
  12. name=reuquest.data.get('name')
  13. pwd=reuquest.data.get('pwd')
  14. user=models.User.objects.filter(username=name,password=pwd).first()
  15. if user:
  16. token=get_random(name)
  17. models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
  18. back_msg['status']=''
  19. back_msg['msg']='登录成功'
  20. back_msg['token']=token
  21. else:
  22. back_msg['msg'] = '用户名或密码错误'
  23. except Exception as e:
  24. back_msg['msg']=str(e)
  25. return Response(back_msg)
  26.  
  27. class Course(APIView):
  28. authentication_classes = [TokenAuth, ]
  29.  
  30. def get(self, request):
  31. return HttpResponse('get')
  32.  
  33. def post(self, request):
  34. return HttpResponse('post')

附:不存数据库的token验证

  1. def get_token(id,salt=''):
  2. import hashlib
  3. md=hashlib.md5()
  4. md.update(bytes(str(id),encoding='utf-8'))
  5. md.update(bytes(salt,encoding='utf-8'))
  6.  
  7. return md.hexdigest()+'|'+str(id)
  8.  
  9. def check_token(token,salt=''):
  10. ll=token.split('|')
  11. import hashlib
  12. md=hashlib.md5()
  13. md.update(bytes(ll[-1],encoding='utf-8'))
  14. md.update(bytes(salt,encoding='utf-8'))
  15. if ll[0]==md.hexdigest():
  16. return True
  17. else:
  18. return False
  19.  
  20. class TokenAuth():
  21. def authenticate(self, request):
  22. token = request.GET.get('token')
  23. success=check_token(token)
  24. if success:
  25. return
  26. else:
  27. raise AuthenticationFailed('认证失败')
  28. def authenticate_header(self,request):
  29. pass
  30. class Login(APIView):
  31. def post(self,reuquest):
  32. back_msg={'status':1001,'msg':None}
  33. try:
  34. name=reuquest.data.get('name')
  35. pwd=reuquest.data.get('pwd')
  36. user=models.User.objects.filter(username=name,password=pwd).first()
  37. if user:
  38. token=get_token(user.pk)
  39. # models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
  40. back_msg['status']=''
  41. back_msg['msg']='登录成功'
  42. back_msg['token']=token
  43. else:
  44. back_msg['msg'] = '用户名或密码错误'
  45. except Exception as e:
  46. back_msg['msg']=str(e)
  47. return Response(back_msg)
  48. from rest_framework.authentication import BaseAuthentication
  49. class TokenAuth():
  50. def authenticate(self, request):
  51. token = request.GET.get('token')
  52. token_obj = models.UserToken.objects.filter(token=token).first()
  53. if token_obj:
  54. return
  55. else:
  56. raise AuthenticationFailed('认证失败')
  57. def authenticate_header(self,request):
  58. pass
  59.  
  60. class Course(APIView):
  61. authentication_classes = [TokenAuth, ]
  62.  
  63. def get(self, request):
  64. return HttpResponse('get')
  65.  
  66. def post(self, request):
  67. return HttpResponse('post')

总结:局部使用,只需要在视图类里加入:

  1. authentication_classes = [TokenAuth, ]

三、全局使用

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

四、源码分析

  1. #Request对象的user方法
  2. @property
  3. def user(self):
  4. the authentication classes provided to the request.
  5. if not hasattr(self, '_user'):
  6. with wrap_attributeerrors():
  7. self._authenticate()
  8. return self._user
  9.  
  10. def _authenticate(self):
  11. for authenticator in self.authenticators:
  12. try:
  13. user_auth_tuple = authenticator.authenticate(self)
  14. except exceptions.APIException:
  15. self._not_authenticated()
  16. raise
  17. #认证成功,可以返回一个元组,但必须是最后一个验证类才能返回
  18. if user_auth_tuple is not None:
  19. self._authenticator = authenticator
  20. self.user, self.auth = user_auth_tuple
  21. return
  22.  
  23. self._not_authenticated()

self.authenticators

  1. def get_authenticators(self):
  2. return [auth() for auth in self.authentication_classes]

认证类使用顺序:先用视图类中的验证类,再用settings里配置的验证类,最后用默认的验证类

restful framework之认证组件的更多相关文章

  1. RESTful源码笔记之RESTful Framework的基本组件

    快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式. ...

  2. DRF Django REST framework 之 认证组件(五)

    引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...

  3. Django REST Framework之认证组件

    什么是认证 认证即需要知道是谁在访问服务器,需要有一个合法身份.认证的方式可以有很多种,例如session+cookie.token等,这里以token为例.如果请求中没有token,我们认为这是未登 ...

  4. restful framework之序列化组件

    一.Django自带序列化组件 from django.core import serializers def test(request): book_list = Book.objects.all( ...

  5. restful framework之权限组件

    一.权限简介 只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制 二.局部使用 from rest_framework.permissions import BasePerm ...

  6. 基于django rest framework做认证组件

    先导入要用到的类 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...

  7. restful framework之频率组件

    一.频率简介 为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二.自定义频率类.自定义频率规则 自定义的逻辑 #(1)取出访问者ip # (2)判断当前ip不在访问字典里,添加进去 ...

  8. Django高级篇三。restful的解析器,认证组件,权限组件

    一.rest=framework之解析器 1)解析器作用. 根据提交的数据.只解析某些特定的数据.非法数据不接收,为了系统安全问题 比如解析的数据格式有 有application/json,x-www ...

  9. rest framework认证组件和django自带csrf组件区别详解

    使用 Django 中的 csrf 处理 Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查.它的原理是在<fo ...

随机推荐

  1. iOS7中UIView的animateKeyframesWithDuration方法讲解

    iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...

  2. windows下搭建vue开发环境

    Vue.js是一套构建用户界面的 “渐进式框架”.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.2016 ...

  3. Linux su命令详解

    su switch user,用于切换用户用 su常见命令参数 用法:su [选项]... [-] [用户 [参数]... ] Change the effective user id and gro ...

  4. win10不错的快捷键

      A I S number 左右 上下 , Win键 Open Action center. Open Settings. Open Search. Open the app pinned to t ...

  5. swift的Hashable

    Conforming to the Hashable Protocol To use your own custom type in a set or as the key type of a dic ...

  6. BZOJ3667:Rabin-Miller算法(Pollard-Rho)

    Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就 ...

  7. Java并发编程--5.信号量和障碍器

    Semaphore信号量 简介 它本质上是一个共享锁,限制访问公共资源的线程数目,它也被称为计数信号量acquire()许可一个线程, Semaphore – 1; 没有可用的许可时,Semaphor ...

  8. js之checkbox判断常用示例

    checkbox常用示例可参考: 关于checkbox自动选中 checkbox选中并通过ajax传数组到后台接收 MP实战系列(十三)之批量修改操作(前后台异步交互) 本次说的是,还是关于智能门锁开 ...

  9. pl/sql连接远程oracle

    1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...

  10. 牛顿法/拟牛顿法/DFP/BFGS/L-BFGS算法

    在<统计学习方法>这本书中,附录部分介绍了牛顿法在解决无约束优化问题中的应用和发展,强烈推荐一个优秀博客. https://blog.csdn.net/itplus/article/det ...