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 ...
随机推荐
- docker搭建nginx
在Docker下部署Nginx,包括: 部署一个最简单的Nginx,可以通过端口访问默认的网站 设置记录访问和错误日志的路径 以交互模式创建centos容器,如果本地没有镜像,会从仓库获取, 等待即可 ...
- 版本号比较函数-js
面试前,让做的一个版本号比较函数. <script type="text/javascript"> var v1=prompt("请输入第一个版本号" ...
- PAT 1035 插入与归并(25)(代码+思路+测试点分析)
1035 插入与归并(25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到 ...
- [django] Deploy Django Applications Using uWSGI and Nginx on Ubuntu 14.04
关键点1:chmod-socket=666 (mysite_uwsgi.ini) 关键点2 : 工程目录和虚拟环境目录搞清楚 几个参考: http://uwsgi-docs.readthedocs.i ...
- 带你认识那些App可靠性设计
可靠性是软件一个重要的质量属性,它关注的是软件功能持续的可用性,以及出现故障之后是否能够容错,是否能快速的恢复使用. 可靠性六条基本准则 1.故障应在第一时间被检测和感知: 2.能避免的故障都不应该发 ...
- 01 Maven 安装与配置
Maven 安装与配置 1. Maven 介绍 Maven 翻译为 "专家","内行".Maven 是 Apache 下的一个纯 Java 开发的开源项目,它是 ...
- win7安装qt5 纯记录 水文
去qt官网下载http://www.qt.io/看见download就点进去看看吧 目前的下载地址路径是http://www.qt.io/download-open-source选择Offline I ...
- 2、HttpClient修改处理策略Strategy
HttpClient提供了很多接口,让我们能自定义处理逻辑,这些接口可以在AbstractHttpClient中找到: setAuthSchemes(AuthSchemeRegistry); setC ...
- linux 硬盘分区攻略
以下的sdX代表硬盘分区(如sda1,sda2,sdb1...等等),如果已有的硬盘分区需要改变大小的话,请参考另一篇文章. /boot:开机用的磁盘空间了,至少78MB,一般给100MB就好了. / ...
- IC向管理者角色转换
1. 虽然你认为自己已经想明白怎么干,但还是从怎么干回归到要解决的问题,抛给正确的人(应该对这些问题负责的人),引导他们想出问题的答案. 给别人机会和空间,帮助他们成长: 人们对自己“想”出的方案更有 ...