一、设计一个简易的登录

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 之认证权限的更多相关文章

  1. rest-framework框架 -- 认证权限流程源码

    认证权限 解析BaseAuthentication源码 # 做认证权限 from rest_framework import exceptions from ..models import * cla ...

  2. rest-framework框架——认证、权限、频率组件

    一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...

  3. restful知识点之三restframework认证-->权限-->频率

    认证.权限.频率是层层递进的关系 权限业务时认证+权限 频率业务时:认证+权限+频率 局部认证方式 from django.conf.urls import url,include from djan ...

  4. Restframework的认证,权限,节流

    1.认证 流程:请求到达REST framework的时候,会对request进行二次封装,在封装的过程中会对客户端发送过来的request封装进认证,选择,解析等功能.request方法封装完成之后 ...

  5. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

    开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...

  6. Kafka认证权限配置(动态添加用户)

    之前写过一篇Kafka ACL使用实战,里面演示了如何配置SASL PLAINTEXT + ACL来为Kafka集群提供认证/权限安全保障,但有一个问题经常被问到:这种方案下是否支持动态增加/移除认证 ...

  7. django 之(三) --- 认证|权限

    用户模块 登陆注册1:Django2.0  [ 1:N ] user/url.py from django.urls import path from user.views0 import UserT ...

  8. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  9. 基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限

    基本Web API的ASP.NET的Oauth2认证 增加Token额外字段 增加Scope授权字段 持久化Token 设计Token的时间间隔 刷新Token后失效老的Token 自定义验证[重启I ...

随机推荐

  1. Golang之定时器,recover

    滴答滴答……定时器的使用 package main import ( "fmt" "time" ) //定时器的使用 func main() { t := ti ...

  2. OCI 编程

    一.环境的配置 1.系统环境:要想使用OCI编程需要安装Oracle的客户端,而这个普通的客户端比较大,方便起见,可以安装即时客户端(Instantclient)作为Oracle的访问客户端.  具体 ...

  3. Codeforces 665A. Buses Between Cities 模拟

    A. Buses Between Cities time limit per test: 1 second memory  limit per test: 256 megabytes input: s ...

  4. [SoapUI] How to create a random UUID in each Request's Headers

    ${=java.util.UUID.randomUUID()}  is OK

  5. Jmeter参数化HTTP request中Send Files With The Request的文件路径和文件名

  6. 简单的socket编程

    1.socket 服务器搭建 实例化socket服务器,循环获取请求 package com.orange.util; import java.io.IOException; import java. ...

  7. 20155333 2016-2017-2 《Java程序设计》第五周学习总结

    20155333 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.使用try.catch语法 与C语言中程序流程和错误处理混在一起不同,Java中把正常流 ...

  8. 2018.09.27 网络协议(tarjan)

    描述 一些学校连接在一个计算机网络上.学校之间存在软件支援协议.每个学校都有它应支援的学校名单(学校 a 支援学校 b ,并不表示学校 b 一定支援学校 a ).当某校获得一个新软件时,无论是直接得到 ...

  9. 2018.09.15 秘密的牛奶管道SECRET(次小生成树)

    描述 约翰叔叔希望能够廉价连接他的供水系统,但是他不希望他的竞争对手知道他选择的路线.一般这样的问题需要选择最便宜的方式,所以他决定避免这种情况而采用第二便宜的方式. 现在有W(3 <= W & ...

  10. 23. Man and His Natural Habitat 人类及其自然栖息地

    . Man and His Natural Habitat 人类及其自然栖息地 ① Ecology is that branch of science which concerns itself wi ...