restful framework之认证组件
一、认证介绍
只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件
二、局部使用
(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']=''
- 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=''):
- 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=''):
- 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']=''
- 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')
总结:局部使用,只需要在视图类里加入:
- authentication_classes = [TokenAuth, ]
三、全局使用
- REST_FRAMEWORK={
- "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
- }
四、源码分析
- #Request对象的user方法
- @property
- def user(self):
- the authentication classes provided to the request.
- if not hasattr(self, '_user'):
- with wrap_attributeerrors():
- self._authenticate()
- return self._user
- def _authenticate(self):
- for authenticator in self.authenticators:
- try:
- user_auth_tuple = authenticator.authenticate(self)
- except exceptions.APIException:
- self._not_authenticated()
- raise
- #认证成功,可以返回一个元组,但必须是最后一个验证类才能返回
- if user_auth_tuple is not None:
- self._authenticator = authenticator
- self.user, self.auth = user_auth_tuple
- return
- self._not_authenticated()
self.authenticators
- def get_authenticators(self):
- return [auth() for auth in self.authentication_classes]
认证类使用顺序:先用视图类中的验证类,再用settings里配置的验证类,最后用默认的验证类
restful framework之认证组件的更多相关文章
- RESTful源码笔记之RESTful Framework的基本组件
快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式. ...
- DRF Django REST framework 之 认证组件(五)
引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...
- Django REST Framework之认证组件
什么是认证 认证即需要知道是谁在访问服务器,需要有一个合法身份.认证的方式可以有很多种,例如session+cookie.token等,这里以token为例.如果请求中没有token,我们认为这是未登 ...
- restful framework之序列化组件
一.Django自带序列化组件 from django.core import serializers def test(request): book_list = Book.objects.all( ...
- restful framework之权限组件
一.权限简介 只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制 二.局部使用 from rest_framework.permissions import BasePerm ...
- 基于django rest framework做认证组件
先导入要用到的类 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...
- restful framework之频率组件
一.频率简介 为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二.自定义频率类.自定义频率规则 自定义的逻辑 #(1)取出访问者ip # (2)判断当前ip不在访问字典里,添加进去 ...
- Django高级篇三。restful的解析器,认证组件,权限组件
一.rest=framework之解析器 1)解析器作用. 根据提交的数据.只解析某些特定的数据.非法数据不接收,为了系统安全问题 比如解析的数据格式有 有application/json,x-www ...
- rest framework认证组件和django自带csrf组件区别详解
使用 Django 中的 csrf 处理 Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查.它的原理是在<fo ...
随机推荐
- iOS7中UIView的animateKeyframesWithDuration方法讲解
iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...
- windows下搭建vue开发环境
Vue.js是一套构建用户界面的 “渐进式框架”.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.2016 ...
- Linux su命令详解
su switch user,用于切换用户用 su常见命令参数 用法:su [选项]... [-] [用户 [参数]... ] Change the effective user id and gro ...
- win10不错的快捷键
A I S number 左右 上下 , Win键 Open Action center. Open Settings. Open Search. Open the app pinned to t ...
- swift的Hashable
Conforming to the Hashable Protocol To use your own custom type in a set or as the key type of a dic ...
- BZOJ3667:Rabin-Miller算法(Pollard-Rho)
Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就 ...
- Java并发编程--5.信号量和障碍器
Semaphore信号量 简介 它本质上是一个共享锁,限制访问公共资源的线程数目,它也被称为计数信号量acquire()许可一个线程, Semaphore – 1; 没有可用的许可时,Semaphor ...
- js之checkbox判断常用示例
checkbox常用示例可参考: 关于checkbox自动选中 checkbox选中并通过ajax传数组到后台接收 MP实战系列(十三)之批量修改操作(前后台异步交互) 本次说的是,还是关于智能门锁开 ...
- pl/sql连接远程oracle
1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...
- 牛顿法/拟牛顿法/DFP/BFGS/L-BFGS算法
在<统计学习方法>这本书中,附录部分介绍了牛顿法在解决无约束优化问题中的应用和发展,强烈推荐一个优秀博客. https://blog.csdn.net/itplus/article/det ...