rest framework 的权限管理
下面是对单个的视图进行的设置的:
请求的时候用postman然后发送信息
我们下面所有的举例都是在用户对Comment这个表的操作
首先先生成一个类似于cookie的字符串 发送给前端浏览器 然后下次它再访问带着这个认证字符串
登陆视图
#登陆视图 class LoginView(APIView):
def post(self,request):
ret = {"status":0}
print(request.data) username = request.data.get("username")
password = request.data.get('password') user_obj = models.UserInfo.objects.filter(username = username,password = password).first() # 校验看传递进来的是否对的
print(11111) if user_obj:
print(2222222)
#校验成功 加密并且写入 Token中它的
token = get_token_code(username)
models.Token.objects.update_or_create(defaults={'token':token},user = user_obj) # 有就更新 没有就创建
ret['token'] = token #加密的内容存起来
else:
ret['status'] = 1
ret['error'] = "用户名或密码错误" return Response(ret)
生成请求的token字符串:
#生成Token函数
def get_token_code(username):
'''
根据用户名和时间戳生成用户登陆成功过的随机字符串
:param username: 字符串格式用户名
:return: 字符串格式Token
''' import time
import hashlib
timestamp = str(time.time())
m = hashlib.md5(bytes(username,encoding="utf8"))
m.update(bytes(timestamp,encoding="utf8"))
return m.hexdigest()
认证: BaseAuthentication
from rest_framework.authentication import BaseAuthentication # 认证模块
抛错模块:
from rest_framework.exceptions import AuthenticationFailed # 模块报错 返回信息
我们可以根据这个来设置 登陆人的信息 只有登陆成功后才能进行提交post之类的操作
这个时候就用到了我们的权限设置
我们写一个文件来存放登陆的信息设置:
from rest_framework.authentication import BaseAuthentication # 认证模块 from first import models from rest_framework.exceptions import AuthenticationFailed # 模块报错 返回信息
import logging
logger = logging.getLogger(__name__)
class MyAuth(BaseAuthentication): def authenticate(self, request):
print(request.method)
if request.method in ["POST","PUT","DELETE"]:
token = request.data.get("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
views:
就是把你的认证设置导入进来 然后再用到post get操作的总操作的集合模块对操作设置
from first.utils.auth import MyAuth #导入你的 认证信息设置 class CommentViewSet(ModelViewSet):
queryset = models.Comment.objects.all()
serializer_class = first_serializers.Commentserializer #这个是你的对Comment的定义设置的 authentication_classes = [MyAuth] # 让你设置的认证生效
视图级别认证
class CommentViewSet(ModelViewSet):
queryset = models.Comment.objects.all()
serializer_class = app01_serializers.CommentSerializer
authentication_classes = [MyAuth, ]
全局级别认证
# 在settings.py中配置
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.MyAuth", ]
}
权限管理:BasePermission
from rest_framework.permissions import BasePermission #导入权限设置的模块
也是设置一个权限管理的模块:
from rest_framework.permissions import BasePermission #导入权限设置的模块 class MyPermission(BaseException):
message = '快滚,没有权限!' def has_permission(self,request,view):
'''
判断该用户有没有权限
如果有就返回True
如果没有就返回False
'''
print('我要进行自定义设置了')
return True def has_object_permission(self,request,view,obj): # 重写父类的方法 名字必须这样 '''
obj是你的当前文章的作者对象
判断当前的评论用户作者是不是你当前的用户
只有评论的作者才能删除自己的评论
'''
if request.method in ['PUT',"DELETE"]:
if obj.user == request.user:
# 当前要删除的评论的作者就是当前登陆的用户
return True
else:
return False
else:
return True
views:
from first.utils.auth import MyAuth #导入你的 认证信息设置
from first.utils.permission import MyPermission #导入权限管理的模块 class CommentViewSet(ModelViewSet): queryset = models.Comment.objects.all()
serializer_class = first_serializers.Commentserializer #这个是你的对Comment的定义设置的 authentication_classes = [MyAuth,] permission_classes = [MyPermission,] # 把你权限管理的设置导入进来
这个时候你就要给你的url设置了 就像之前解除的 继承全局的然后并不需要设置很多url 设置一个就可以
ursl:
from rest_framework.routers import DefaultRouter router = DefaultRouter()
router.register(r'comment', views.CommentViewSet) #这个就是设置你的输入并且查找的视图
urlpatterns += router.urls
限制:
from rest_framework.throttling import SimpleRateThrottle
定义一个访问次数限制:
自定以的限制:
class VisitThorttle(SimpleRateThrottle):
scope = "ooo" #这个名字随便起 是你设置全局的时候的给对应的
def get_cache_key(self, request, view):
return self.get_ident(request) # 求当前访问的IP
其实上面是执行了这个流程:
'''
自定义访问限制类
''' from rest_framework.throttling import BaseThrottle,SimpleRateThrottle from rest_framework.throttling import SimpleRateThrottle import time D = {} class MyThorttle(BaseThrottle):
def allow_request(self, request, view):
'''
返回True就放行 返回False 表示被限制了 '''
# 获取当前的ip
ip = request.META.get("REMOTE_ADDR") # 获取请求的IP
print('这是自定义希纳是类的allow_request')
print(ip) #获取当前时间
now = time.time()
#判断当前ip是否有访问记录
if ip in D:
D[ip] = [] #初始化一个空的访问历史列表
#高端
history = D[ip]
while history and now -history[-1] > 30: #有ip并且当前时间减去储存的最后一个时间
history.pop()
if len(history) >= 3:
return False
else:
# 把这一次的访问时间加到访问历史列表的第一位
D[ip].insert(0,now)
return True class VisitThorttle(SimpleRateThrottle):
scope = "ooo" #这个名字随便起
def get_cache_key(self, request, view):
return self.get_ident(request) # 求当前访问的IP
真正流程
views:
from first.utils.throttle import VisitThorttle # 导入自定义访问限制
class CommentViewSet(ModelViewSet):
queryset = models.Comment.objects.all()
serializer_class = first_serializers.Commentserializer #这个是你的对Comment的定义设置的
throttle_classes = [VisitThorttle,] #把自定义的访问限制类
全局设置 全局的请求设置是你只要进去就会触发 而我们在views中的设置 只是有针对的对一些视图进行设置
全局设置:
在settings设置;
# rest framework相关的配置项
REST_FRAMEWORK = {
关于认证的全局配置
'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.auth.MyAuth', ],
'DEFAULT_PERMISSION_CLASSES': ['app01.utils.permission.MyPermission'],
#"DEFAULT_THROTTLE_CLASSES": ["app01.utils.throttle.MyThrottle", ],
"DEFAULT_THROTTLE_RATES": { # 这个和上面的都可以设置
"ooo": "5/m", # ooo对应你后自定以的设置的scope
"xxx": '10/m'
}
}
rest framework 的权限管理的更多相关文章
- ASP.NET 开发必备知识点(2):那些年追过的ASP.NET权限管理
一.前言 在前一篇文章已经为大家介绍了OWIN和Katana,有了对他们的了解之后,才能更好地去学习Asp.net Identity,因为Asp.net Identity的实现集成了Owin.其实在A ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
- YIi 权限管理和基于角色的访问控制
验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ( ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 (2):数据 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...
- 开篇ASP.NET MVC 权限管理系列
开篇 [快乐编程系列之ASP.NET MVC 权限管理系列]一.开篇 用了好长一段时间的ASP.NET MVC,感觉MVC真的是很好用,最近一年左右做了两个中小型项目,觉得还是很多地方不是很熟悉的 ...
随机推荐
- IntelliJ IDEA使用心得之快捷键篇
关于IDEA快捷键的文章有很多,因此,我只对经常使用快捷键进行介绍. 因为我的第一款IDE是eclipse,因此我是根据eclipse的快捷键习惯来重置IDEA的快捷键. 点击进入IDE设置界面:
- PostgreSQL执行超时的问题
PostgreSQL执行超时的问题 使用背景 最近在使用PostgreSQL的时候,在执行一些数据库事务的时候,先后出现了statement timetout 和idle-in-transaction ...
- Go 开发
0.参数传递永远是值传递,地址也是一种值 1.go 开发环境的配置 2.import 包的几种形式: 1)_,默认导入一个包时,会将包中内容导入再执行包中的init()方法,有时并不需要某个包,只是想 ...
- 14-hadoop-运行的2种方式
hadoop的程序运行有, 具体有3种, 除了上一篇(http://www.cnblogs.com/wenbronk/p/6662119.html)提过的直接发布jar上传到hadoop以外, 还有本 ...
- JavaScript初级面试题
前面几题是会很基础,越下越有深度. 初级Javascript: 1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型: ...
- 前端项目中使用git来做分支和合并分支,管理生产版本
最近由于公司前端团队扩招,虽然小小的三四团队开发,但是也出现了好多问题.最让人揪心的是代码的管理问题:公司最近把版本控制工具从svn升级为git.前端H5组目前对git的使用还不是很熟悉,出现额多次覆 ...
- [BJOI 2018]求和
Description 题库链接 给你一棵 \(n\) 个结点的有根树, \(m\) 次询问这棵树上一段路径上所有节点深度的 \(k\) 次方和. \(1\leq n\leq 300000,1\leq ...
- 请整体描述Java异常体系
java把异常当做对象来处理,并定义一个基类Throwable作为所有异常的超类.在java API中已经定义了许多异常的类,这些异常分为两大类,错误Error和异常Exception.其中异常Exc ...
- 三角形-->九九乘法表
使用嵌套循环打印九行*组成的三角形: * ** *** ...... *********(9个) public class Triangle { /** * 使用嵌套循环打印九行*组成的三角形 */ ...
- 设计模式学习——工厂模式(Factory Pattern)
1.有一个工厂,专门生产不同品牌的汽车.当有人需要从此工厂提货的时候,只需要告诉他,要什么品牌的,就可以了,并不关心这些车是怎么生产出来的. 2.以上方式,如果增加品牌的时候,也要修改工厂,有点麻烦. ...