一、设计一个简易的登录

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. css3阴影效果

    http://blog.csdn.net/freshlover/article/details/7610269

  2. 深入了解 php 底层机制 (-)洪定坤

  3. Unsupported major.minor version 49.0的错误解决

    Unsupported major.minor version 49.0的错误解决 Posted on 2011-01-14 16:49 chinaifne 阅读(15840) 评论(0)  编辑 收 ...

  4. 查询yum包安装路径

    rpm -ql php71-php yum install json yum install libcurl

  5. CString 作为参数执行都不执行

    static int LoadUsbSDK(CString curpath ) win10系统下 CString 函数加载dll直接跳过 加载dll最好不要带参数

  6. [Groovy] List和Map用法搜集

    http://chenfeng0104.iteye.com/blog/609075 http://www.cnblogs.com/muzi1994/p/5169928.html https://zhi ...

  7. asio 广播代码示例

    代码网络收集 修改了一个编译的小问题 客户端 // Client.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...

  8. 继续修改爬虫百度贴吧,这次随意贴吧的任何一个index页都行,然后自动d盘生成tupian文件夹来保存

    from urllib.request import urlopenfrom bs4 import BeautifulSoupfrom urllib.request import urlopenimp ...

  9. 关于某一discuz 6.0论坛故障的记录

    某日,额突然发现公司的discuz 6.0论坛在IE6浏览器下面显示出现问题: 每个链接都出现了下划线,很难看,不过已访问的链接(a:visted)却没有下划线,于是怀疑css.htm有问题.于是对c ...

  10. 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)

    传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...