S11 day 96 RestFramework 之认证权限
一、设计一个简易的登录
1. 建立一个模型
class UserInfo(models.Model):
username =models.CharField(max_length=)
password =models.CharField(max_length=) type =models.SmallIntegerField(
choices=((,"普通用户"),(,"vip用户")),
default=
) class Token(models.Model):
token =models.CharField(max_length=)
user=models.OneToOneField(to="UserInfo")
makemigration ,migrate ,添加数据
2.设计url
url(r'login/$', views.LoginView.as_view()),
3.制作一个视图类进行简单登录
lass LoginView(APIView):
def post(self,request):
print(request.data)
res={"code":}
username =request.data.get("username")
password =request.data.get("password")
#去数据库查询
user_obj = models.UserInfo.objects.filter(
username =username ,
password=password,
).first()
if user_obj:
#登录成功
#发token
res["data"] ="登录成功" else:
#登录失败
res["code"] =
res["error"] = "用户名或密码错误"
return Response(res)
输出结果:

二 、认证
4. 为视图增加一个生成token的功能
#生成Token的函数
def get_token_code(username):
"""
根据用户名和时间戳生成用户登录成功的随机字符串
:param username: 字符串格式的用户名
:return: 返回字符串格式的token
"""
import time,hashlib
timestamp =str(time.time())
m =hashlib.md5(bytes(username,encoding="utf-8"))
m.update(bytes(timestamp,encoding="utf-8"))
return m.hexdigest() #登录视图
class LoginView(APIView):
def post(self,request):
print(request.data)
res={"code":}
username =request.data.get("username")
password =request.data.get("password")
#去数据库查询
user_obj = models.UserInfo.objects.filter(
username =username ,
password=password,
).first()
if user_obj:
#登录成功
#生成token
token= get_token_code(username)
#将token保存
#用户user =user_obj 这个条件去token表里查询,如果有的话就更新default里的参数,没有记录就创建
models.Token.objects.update_or_create(defaults={"token":token},user =user_obj)
res["data"] ="登录成功" else:
#登录失败
res["code"] =
res["error"] = "用户名或密码错误"
return Response(res)

5. 测试token能否生成。


6. get请求里的token和数据库里的token进行对比.


7.认证的代码
红色部分为局部认证
from app01.utils1.auth import MyAuth
from rest_framework.viewsets import ModelViewSet
class CommentView(ModelViewSet):
queryset = models.Comment.objects.all()
serializer_class = app01_serializers.CommentSerializer
authentication_classes = [MyAuth,] #视图认证,属于局部认证.
全局认证写在settings里
REST_FRAMEWORK = {
# #关于认证的全局配置.
"DEFAULT_AUTHENTICATION_CLASSES":["app01.utils.MyAuth",]
}
#登录视图
class LoginView(APIView):
def post(self,request):
print(request.data)
res={"code":}
username =request.data.get("username")
password =request.data.get("password")
#去数据库查询
user_obj = models.UserInfo.objects.filter(
username =username ,
password=password,
).first()
if user_obj:
#登录成功
#生成token
token= get_token_code(username)
#将token保存
#用户user =user_obj 这个条件去token表里查询,如果有的话就更新default里的参数,没有记录就创建
models.Token.objects.update_or_create(defaults={"token":token},user =user_obj)
res["data"] ="登录成功" else:
#登录失败
res["code"] =
res["error"] = "用户名或密码错误"
return Response(res)
"""
自定义的认证都放在这里
"""
from rest_framework.authentication import BaseAuthentication
from app01 import models
from rest_framework.exceptions import AuthenticationFailed class MyAuth(BaseAuthentication):
def authenticate(self, request):
if request.method in ["POST","PUT","DELETE"]:
token =request.data.get("token")
#去数据库中查找有没有这个这个token
token_obj =models.Token.objects.filter(token=token).first()
if token_obj:
return token_obj.user,token
else :
raise AuthenticationFailed("无效的token") else:return None,None
三、权限
"""
自定义的权限类 # """ from rest_framework.permissions import BasePermission
class Mypermission(BasePermission):
message={}
def has_permission(self, request, view):
"""
判断该用户有没有权限
"""
#判断用户是不是vip用户
#如果是vip用户就返回trun
#普通用户就返回false
print("requet--->",request.user.username)
print("requet--->",request.user.type)
if request.user.type ==:#是vip用户
return True
else:
return False def has_object_permission(self, request, view, obj):
"""
判断当前评论的作者是不是当前的用户
只有作者自己才能评论自己的文章 """
print("这是在自定义权限类里的")
print(obj)
if request.method in ["PUT","DELETE"]:
if obj.user == request.user:
#当前要删除评论的作者就是当前登录的账号
return True
else:
return False
else:
return True
四、限制 频率
方法1 .
'''
自定义的访问限制类 第一种方法
'''
from rest_framework.throttling import BaseThrottle
import time
VISIT = { }#{ "127.0.0.1":[,,]} class MyThrottle(BaseThrottle):
def allow_request(self, request, view):
"""
返回true 就表示放行,返回false表示被限制....
:param request:
:param view:
:return:
"""
# . 获取当前的访问ip
ip=request.META.get("REMOTE_ADDR")
print("这是自定义限制类中的allow_request")
print(ip)
#. 获取当前的时间
now =time.time
#判断当前ip是否有访问记录
if ip not in VISIT:
VISIT[ip]=[] #初始化一个空的访问列表
#把这一次的访问时间交到访问历史列表的第一位
history =VISIT[ip]
while history and now - history[-]>:
history.pop()
#判断最近一分钟的访问次数是否超过了阈值(3次)
if len(history)>=:
return False
else:
VISIT[ip].insert(, now)
return True


方法2.
'''
自定义的访问限制类 第二种方法 ,采用源码的代码
'''
# VISIT2={
# "XXX":{
# ip:[]
# }
# }
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
scope ="xxx"
def get_cache_key(self, request, view):
return self.get_ident(request) #求当前访问的ip


S11 day 96 RestFramework 之认证权限的更多相关文章
- rest-framework框架 -- 认证权限流程源码
认证权限 解析BaseAuthentication源码 # 做认证权限 from rest_framework import exceptions from ..models import * cla ...
- rest-framework框架——认证、权限、频率组件
一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...
- restful知识点之三restframework认证-->权限-->频率
认证.权限.频率是层层递进的关系 权限业务时认证+权限 频率业务时:认证+权限+频率 局部认证方式 from django.conf.urls import url,include from djan ...
- Restframework的认证,权限,节流
1.认证 流程:请求到达REST framework的时候,会对request进行二次封装,在封装的过程中会对客户端发送过来的request封装进认证,选择,解析等功能.request方法封装完成之后 ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限
开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...
- Kafka认证权限配置(动态添加用户)
之前写过一篇Kafka ACL使用实战,里面演示了如何配置SASL PLAINTEXT + ACL来为Kafka集群提供认证/权限安全保障,但有一个问题经常被问到:这种方案下是否支持动态增加/移除认证 ...
- django 之(三) --- 认证|权限
用户模块 登陆注册1:Django2.0 [ 1:N ] user/url.py from django.urls import path from user.views0 import UserT ...
- 实战-DRF快速写接口(认证权限频率)
实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...
- 基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限
基本Web API的ASP.NET的Oauth2认证 增加Token额外字段 增加Scope授权字段 持久化Token 设计Token的时间间隔 刷新Token后失效老的Token 自定义验证[重启I ...
随机推荐
- 使用System.Net.Mail发送邮件
引用命名空间: using System.Net.Mail; /// <summary> /// 发送HTML邮件,有抄送和密送 /// 需要在Web.config文件中的system.n ...
- IIS 6.0/7.0/7.5、Nginx、Apache 等服务器解析漏洞总结
IIS 6.0 1.目录解析:/xx.asp/xx.jpg xx.jpg可替换为任意文本文件(e.g. xx.txt),文本内容为后门代码 IIS6.0 会将 xx.jpg 解析为 asp 文件. ...
- iOS.AVCaptureSession
AVCaptureSession的使用容易freeze的问题 1. http://stackoverflow.com/questions/11905505/avcapturesession-stop- ...
- 修改socket缓冲区大小
#include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <sys/sock ...
- 删除pdf文件所有超链接
最近在读deep learning 书Bengio那本,在Github上面下载的,下载回来全都是超链接, 超级烦,比如点一下梯度下降法,就直接跳转到数后尾的index. 我看书还喜欢老点,所以要把他们 ...
- JSONModel简便应用
JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事 ...
- bitset相关
位关联容器 bitset<1000> s ;//新建一个容量为1000位的bitset s.test(k); //读取第k位,结果为0或1 s.set(k); ...
- Deployment failure on Tomcat 6.x. Could not copy all resources to D:\...\webapps\eptInfo. If a file is locked, you can wait until the lock times out to redeploy, or stop the server and redeploy, or ma
tomcat服务并没有启动.工程中之前引了一个包,后来这个包被删除了,但是因为已经发布过这个工程了,所以classpath中就有这个包名了,这样发布的时候也会去找这个包但是已经不存在了,所以无copy ...
- 动态渲染的input怎么取消记忆功能
方法1 :自定义去除记忆功能属性: $('#index_table_filter > label > input[type="search"]').attr('auto ...
- Redis配置总结
一:常用配置 1.bind,格式为bind 127.0.0.1:这个是很重要的配置,如果bind 127.0.0.1则外部网络是访问不了的(如果外部网络要访问还要开放端口) 2.port,格式为por ...
