drf认证与权限
1 认证
# 登录认证---》某个接口必须登录后才能房屋
# 登录接口---》登录成功返回随机字符串---》携带随机字符串【认证】 通过,再继续访问某个接口
# 读APIView源码时,三大认证---》视图类的方法之前执行的----》drf提供了很方便的写认证
# 写一个登录接口
-用户表,用户token表
-前端传入用户名密码----》视图类---》登录方法---》校验用户名密码是否正确,如果正确 生成随机字符串存入数据库---》把随机字符串返回给前端
# 随便写个接口---》登录后才能访问
# 写认证类
-第一步:写一个类,继承BaseAuthentication
-第二步:在类中重写authenticate方法
-第三步:在方法中做验证,如果通过,返回两个值,如果不通过,抛AuthenticationFailed的异常
# 使用认证类
-局部使用-->视图类中
class BookView(APIView):
authentication_classes = [LoginAuth,]
-全局使用---》配置文件
REST_FRAMEWORK = {
# 全局使用认证类
'DEFAULT_AUTHENTICATION_CLASSES':['app01.auth.LoginAuth',]
}
-局部禁用
class BookView(APIView):
authentication_classes = []
# 前端调用接口时
http://127.0.0.1:8000/user/books?token=27954a0e-9b0b-442d-8aff-839ec9f70960
1.1 登录接口
模型类
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
class UserToken(models.Model):
token = models.CharField(max_length=32) # 用户登录成功签发的随机字符串
user = models.OneToOneField(to='User',on_delete=models.CASCADE)
路由
from rest_framework.routers import SimpleRouter
from .views import UserView,BookView
router=SimpleRouter()
router.register('user',UserView,'user')
urlpatterns = [
]
urlpatterns+=router.urls
视图类
class UserView(ViewSet):
authentication_classes = [] # 局部禁用
# 127.0.0.1:8080/user/user/login--->post
@action(methods=['post', ], detail=False)
def login(self, request):
# 取出用户名密码---》去数据库查询---》有就登录成功(生成随机字符串存入数据),没有就登录失败
username = request.data.get('username')
password = request.data.get('password')
user = User.objects.filter(username=username, password=password).first()
if user:
# 登录成功
# 生成一个随机字符串---》uuid--》生成一个随机不重复的值
token = str(uuid.uuid4()) # python 动态强类型
# 存到UserToken表中---》两种情况:之前有了就更新,之前没有就新增
# 有就更新,没有就修改
# defaults=None, **kwargs:传入的去查询,如果能查到使用defaults给的更新
UserToken.objects.update_or_create(user=user, defaults={'token': token})
# UserToken.objects.update_or_create( defaults={'token': token},kwargs={'user':user})
return Response({'code': 100, 'msg': '登录成功', 'token': token})
else:
return Response({'code': 101, 'msg': '用户名或密码错误'})
1.2 认证类
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from .models import UserToken
class LoginAuth(BaseAuthentication):
def authenticate(self, request):
# 做验证,验证用户是否登录
# 放到请求地址中/请求头中
token=request.query_params.get('token')
# 去数据库查 token在不在
user_token=UserToken.objects.filter(token=token).first()
if user_token:
# 验证通过了,返回两个值,第一个值是当前登录用户,第二个值是token
return user_token.user,token
else:
# 验证失败
raise AuthenticationFailed('小伙子,您没有登录,不能访问')
2 权限
# 登录成功了,但是有的接口区分权限,有的人有权限,有的人没权限
# 用户表新增一个 用户类型字段:超级管理员,普通管理员,普通用户
# 权限类的写法
-第一步:写一个类,继承BasePermission
-第二步:重写has_permission方法
-第三步:在has_permission中,进行权限的判断,如果有权限,返回True,如果没有权限,返回False,返回的中文提示信息,使用message字段标识
#权限类的使用
-局部使用-->视图类中
class BookView(APIView):
permission_classes = [PermissionAuth,]
-全局使用---》配置文件
REST_FRAMEWORK = {
# 全局使用认证类
'DEFAULT_PERMISSION_CLASSES':['app01.auth.PermissionAuth',]
}
-局部禁用
class BookView(APIView):
permission_classes = []
补充
# python 是动态强类型语言
# go 是静态强类型语言
# java 是静态强类型语言---》隐士类型转换
#js 是动态弱类型语言
# 动态:解释型语言
# 强弱指的是:数据类型强:不同类型之间不允许之间运算
# 弱类型:不同类型之间不需要转换可以之间运算
# 健壮性----鲁棒性
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方 ...
随机推荐
- RSS经典教程
RSS经典教程 作者:OLD HELPSoldhelps@126.com RSS 指 Really Simple Syndication(真正简易联合) RSS 使您有能力聚合(syndicate)网 ...
- Fortran笔记 派生类型-整理版
以下为整理后的笔记,英文原文 Introduction to Modern Fortran for the Earth System Sciences, 英文翻译 https://www.cnblog ...
- Arrays.sort()降序排序
默认的Java.util包中的Arrays.sort(),可以实现对java中的基本数据类型(byte.char.short.int.long.float.double.boolean)的数组进行升序 ...
- pytorch的cuda版本安装
机器上加了RTX3060的卡,cuda装的11.1的版本,cudnn还不是特别清楚装的哪个版本?vs是2017这个版本的.下面来装pytorch.主要参考这个网站的内容"https://bl ...
- webpack从零开始打造react项目(更新中...)
创建项目 创建文件夹 webpack-test 使用编辑器打开文件夹,我们初始化管理包 npm init -y 生成一个默认的 pageage.json 文件 要想创建react项目,思考我们之前使 ...
- SSM项目
1.环境搭建 1.1 结构目录 1.2 配置逆向工程 1.2.1 pom.xml <?xml version="1.0" encoding="UTF-8" ...
- We've detected suspicious behavior from phone numbers similar to yours. Please try again later or contact us through our help center at help.openai.com.
原因 很多人使用该地区号码,被限制住了 解决办法 过会儿再试,或者换个地区接码
- 二进制k8s 集群新增加node 节点
环境 名称 ip地址 cpu 内存 lgy-k8s-master0021 10.65.0.21 4c 8G lgy-k8s-node0012 10.65.0.12 4c 8G node节点初始化(以新 ...
- vue 页面中切换国际语言
1.npm i vue-i18n 2. 3.main.js 4.vue页面
- Oracle dump文件的一些经验
dump文件对于DBA而言再平常不过了.不过因为dump文件是二进制文件,我们平时使用中不太关注.再导入dump文件时有很多细节和技巧是值得注意的. 1.查看dump文件的一些基本信息 strings ...