前戏

大家都知道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--认证和权限的更多相关文章

  1. DRF 认证、权限、限制

    DRF 认证.权限.限制   认证: 定义一个用户表和一个保存用户的Token表 # ======================day96======================= class ...

  2. drf 认证、权限、限流、过滤、排序、分页器

    认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...

  3. drf认证、权限、限流

    认证Authentication(5星) 认证逻辑及编写步骤 逻辑 认证类:用来校验用户是否登录,如果登录了,继续往下走,如果没有登录,直接返回 编写步骤 -第一步:写一个类,继承BaseAuthen ...

  4. 2. DRF 认证、权限、限流、分页、过滤、序列 化

    2.1 user/urls.py   ModelViewSet注册路由三部曲 from django.urls import include, path from user import views ...

  5. DRF之版本控制、认证和权限组件

    一.版本控制组件 1.为什么要使用版本控制 首先我们开发项目是有多个版本的当我们项目越来越更新,版本就越来越多,我们不可能新的版本出了,以前旧的版本就不进行维护了像bootstrap有2.3.4版本的 ...

  6. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...

  7. python 全栈开发,Day97(Token 认证的来龙去脉,DRF认证,DRF权限,DRF节流)

    昨日内容回顾 1. 五个葫芦娃和三行代码 APIView(views.View) 1. 封装了Django的request - request.query_params --> 取URL中的参数 ...

  8. (四) DRF认证, 权限, 节流

    一.Token 认证的来龙去脉 摘要 Token 是在服务端产生的.如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端.前端可以在每次请求的时候带上 To ...

  9. DRF的版本、认证、权限

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...

  10. DRF(4) - 认证、权限组件

    一.引入 通过前面三节课的学习,我们已经详细了解了DRF提供的几个重要的工具,DRF充分利用了面向对象编程的思想,对Django的View类进行了继承,并封装了其as_view方法和dispatch方 ...

随机推荐

  1. Missing associated label more...

    1.加上placeholder,可以为空 2.放在label标签中

  2. Geodesic 什么是“测地线的”?

    确定是使用上椭球体(测地线)还是平地上(平面)的最短路径.强烈建议将 Geodesic 方法用于在不适合进行距离测量的坐标系(例如 Web 墨卡托或任何地理坐标系)中存储的数据,以及任何地理区域跨度较 ...

  3. 部署vue-element-admin流程

    1.修改环境变量: 在以下两个文件: .env_staging [如果修改这个,需要以npm run build:stage启动] .env_production [如果修改这个,需要以npm run ...

  4. Hello universe!

    Hello, universe. This is my first cnblogs article.this blog apply to computer technology and another ...

  5. arcgis api 4.x for js 自定义叠加图片图层实现地图叠加图片展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

  6. C++ map insert 另一个map的子集

    C++map中 会有insert操作,举个例子 存在map A,我们截取一部分到map B中,void insert (InputIterator first, InputIterator last) ...

  7. Python函数(函数定义、函数调用)用法详解

    Python 中,函数的应用非常广泛,前面章节中我们已经接触过多个函数,比如 input() .print().range().len() 函数等等,这些都是 Python 的内置函数,可以直接使用. ...

  8. mysql分布式

    一,复制,对数据进行备份,实现搞可用,提高吞吐量,实现高性能. 1,主从架构 2,多主架构 3,主主从从 4,主备 (实际用得多) 二,分片/分库分表 () 1,垂直拆分 1,垂直分表 2,垂直分库 ...

  9. R3环申请内存时页面保护与_MMVAD_FLAGS.Protection位的对应关系

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) R3环申请内存时页 ...

  10. centos7.2安装及管理docker

    使用的操作系统是是centos7.2,按照官方的推荐的配置,把linux内核升级到3.8以上.安装步骤如下: 1.升级内核版本(包含aufs)cd /etc/yum.repos.dwget http: ...