DRF--认证和权限
前戏
大家都知道http协议是无状态的,每次发送请求他们怎么知道我们是不是登录过呢?我们可以在用户登录之后给用户一个“暗号”,下次请求的时候带着这个“暗号”来。我们拿自己存的和携带过来的进行对比,如果一样,就可以认为是登录过的。
认证
先来创建一张用户表
class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
token = models.UUIDField(null=True, blank=True) # 随机字符串
在进行数据库的迁移,在数据库里添加几条数据。
接下来就可以写我们的认证了,新建个py文件,写入如下内容,假设前端妹子给我们传来的token是在url里
from .models import User
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authentication import BaseAuthentication class MyAuth(BaseAuthentication):
def authenticate(self, request): # 必须是这个函数名
# 拿到前端传来的token,判断token是否存在
token = request.query_params.get('token', '')
if not token:
raise AuthenticationFailed("缺少token")
user_obj = User.objects.filter(token=token).first()
if not user_obj:
raise AuthenticationFailed("token不合法")
return (user_obj, token)
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from course.models import Account
from django.utils.timezone import now # 要用django提供的时间 class MyAuth(BaseAuthentication):
def authenticate(self, request):
if request.method == 'OPTIONS': #过滤掉options请求
return None
# 拿到前端传来的token,请求头的数据都在request.META里
# 比如前端把token放在请求头里:authenticate:85ada55664sfqq6
# django会在前面加上 HTTP_ 并转为大写,也就是 HTTP_AUTHENTICATE
# print(request.META)
token = request.META.get('HTTP_AUTHENTICATE', '') # 判断是否有这个token
if not token:
raise AuthenticationFailed({"code": 1020, "error": "没有token"})
user_obj = Account.objects.filter(token=token).first()
if not user_obj:
raise AuthenticationFailed({"code": 1021, "error": "token不合法"}) # 判断token是否过期
old_time = user_obj.create_token_time # 数据库里存的token的时间
now_time = now() # 用django提供获取时间的方法
if (now_time - old_time).days > 7:
raise AuthenticationFailed({"code": 1022, "error": "token已过期,请重新登录"})
return (user_obj, token)
token在请求头里
写个视图测试
class TestView(APIView):
# 添加认证
authentication_classes = [MyAuth,] # 必须为可迭代对象
def get(self, request):
return Response('认证')
这样只是个一个方法添加了认证,也可以添加全局的认证,在settings.py文件里
REST_FRAMEWORK = {
# 默认使用的版本控制类
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
# 允许的版本
'ALLOWED_VERSIONS': ['v1', 'v2'],
# 版本使用的参数名称
'VERSION_PARAM': 'version',
# 默认使用的版本
'DEFAULT_VERSION': 'v1',
# 配置全局认证
'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ]
}
权限
我们都看过app上的电影,vip可以看一些视频,不是vip就看不了。因为vip的权限比非vip的权限大。那程序中的权限是什么样的呢?假设我们有一个系统,里面有添加学员,查看学员的功能。有些用户两个功能都有,而有些用户只有添加学员的功能。这里就要用到权限控制了。
在DRF的源码里,权限是在认证之后的。我们在执行权限的时候,认证已经执行结束了。
我们的权限类一定要有个has_permission方法,否则会抛出异常。
我们来写一个权限的demo。在上面的model类里给表在加一个type类,表示我们的权限。
from django.db import models class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
token = models.UUIDField(null=True, blank=True) # 随机字符串
type = models.IntegerField(choices=((1, '普通用户'), (2, 'vip用户')), default=1) # 权限字段
在设置一个路由
from django.conf.urls import url ,include
from .views import LoginView, TestView, TestPermission urlpatterns = [
url(r'^login/', LoginView.as_view()),
url(r'^test/', TestView.as_view()),
url(r'^permission/', TestPermission.as_view()), # 权限路由 ]
然后我们去写我们的权限类,新建一个permission.py文件
class MyPermission(object):
message = '权限不足' # 提示信息 def has_permission(self, request, view): # 必须这个名
# 权限逻辑,认证已经执行完了
user_obj = request.user # 因为认证已经执行完了,所以有request.user
print(user_obj)
if user_obj.type == 1: # 返回的是个布尔值
return False
else:
return True
在去写我们的测试视图
class TestPermission(APIView):
authentication_classes = [MyAuth, ] # 认证
permission_classes = [MyPermission, ] # 权限 def get(self, request):
return Response("恭喜你,你有访问权限")
当有权限时(type=2)

无权限时(type=1)

DRF也给我们提供了一些权限类,都在permission类里
from rest_framework import permissions
DRF--认证和权限的更多相关文章
- DRF 认证、权限、限制
DRF 认证.权限.限制 认证: 定义一个用户表和一个保存用户的Token表 # ======================day96======================= class ...
- drf 认证、权限、限流、过滤、排序、分页器
认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...
- drf认证、权限、限流
认证Authentication(5星) 认证逻辑及编写步骤 逻辑 认证类:用来校验用户是否登录,如果登录了,继续往下走,如果没有登录,直接返回 编写步骤 -第一步:写一个类,继承BaseAuthen ...
- 2. DRF 认证、权限、限流、分页、过滤、序列 化
2.1 user/urls.py ModelViewSet注册路由三部曲 from django.urls import include, path from user import views ...
- DRF之版本控制、认证和权限组件
一.版本控制组件 1.为什么要使用版本控制 首先我们开发项目是有多个版本的当我们项目越来越更新,版本就越来越多,我们不可能新的版本出了,以前旧的版本就不进行维护了像bootstrap有2.3.4版本的 ...
- 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用
因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...
- python 全栈开发,Day97(Token 认证的来龙去脉,DRF认证,DRF权限,DRF节流)
昨日内容回顾 1. 五个葫芦娃和三行代码 APIView(views.View) 1. 封装了Django的request - request.query_params --> 取URL中的参数 ...
- (四) DRF认证, 权限, 节流
一.Token 认证的来龙去脉 摘要 Token 是在服务端产生的.如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端.前端可以在每次请求的时候带上 To ...
- DRF的版本、认证、权限
DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...
- DRF(4) - 认证、权限组件
一.引入 通过前面三节课的学习,我们已经详细了解了DRF提供的几个重要的工具,DRF充分利用了面向对象编程的思想,对Django的View类进行了继承,并封装了其as_view方法和dispatch方 ...
随机推荐
- 【转载】C#中decimal保留2位有效小数
在C#的数字运算过程中,有时候针对十进制decimal类型的计算需要保留2位有效小数,针对decimal变量保留2位有效小数有多种方法,可以使用Math.Round方法以及ToString先转换为字符 ...
- 实训第六天(mybatis)
今天实训第六天,我们学习了mybatis这个数据库框架,虽然说框架的环境搭建非常的繁琐,但是在了解原理和流程之后是非常的舒服的.因为有一个强大的工具被我掌握了,所以今天感觉非常的开心. 首先我们是在s ...
- 使用Castle DynamicProxy (AOP)
在本文中,我将引导您了解.NET环境中的面向方面编程(AOP)概念,以及如何使用Castle DynamicProxy创建和附加方面.在我们开始之前,让我快速介绍AOP和 IoC.如果您已经熟悉这些 ...
- Docker-Nginx,发布前端服务
1.安装环境: yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 yum-config-manager \ --add-r ...
- new String()与toString
str.toString是调用了str这个object对象的类的toString方法.一般是返回这么一个String:[class name]@[hashCode].new String(str)是根 ...
- Java - 运算符 方法
本位是复习笔记,不适合零基础 赋值运算符 变量 名称 = 值/表达式 ; 需要注意的是,赋值运算符的计算是按照从右往左的; 注意: 1.在使用赋值符号时,必须保证左侧的类型范围大于等于右侧产生的类型 ...
- ES6-字符串模板
es6字符串模板 // es5 let ananiah = "大诶呀"; let blog = "我要忘了你的样子"+ ananiah; console.log ...
- es6 之class介绍
class ECMAScript 2015 中引入的 JavaScript 类实质上是 JavaScript 现有的基于原型的继承的语法糖.类语法不会为JavaScript引入新的面向对象的继承模型. ...
- Python 中運算子 + 與 * 的 Overload 方法重載功能
字串 String 原本不能像數值一樣有加減乘除運算,但有例外.例如: >>> 'Good' + 'Morning''GoodMorning' 運算子 + 可將2個字串,串接起來. ...
- 剑指offer 27:二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 采用中序遍历遍历二叉树,利用二叉排序树的特性,顺次连接节点,形成 ...