DRF框架的认证组件

核心代码:       self.perform_authentication(request) 

框架自带模块:    from rest_framework import authentication

认证组件的返回值:request.user

自定义的认证组件的钩子方法authenticator.authenticate(self) ;返回值是元组(user,auth)

from rest_framework import authentication

from rest_framework import authentication

class BaseAuthentication(object):
def authenticate(self, request):
# 必须重写该方法,返回元组(user,auth)
return (user_obj,token) class BasicAuthentication(BaseAuthentication): class SessionAuthentication(BaseAuthentication): class TokenAuthentication(BaseAuthentication): class RemoteUserAuthentication(BaseAuthentication):

基于BaseAuthentication类的认证
# myauth.py

from rest_framework import authentication
from AuthDemo.models import UserTable
from rest_framework.exceptions import AuthenticationFailed # 用于抛出异常 # 基于BaseAuthentication类的认证
class AuthoDemo(authentication.BaseAuthentication):
'''验证GET请求是否携带Token'''
def authenticate(self, request):
# 通过/user/test/?token="xxx" 获取token
token = request.query_params.get("token","")
# 如果token不存在
if not token:
# 抛出异常
raise AuthenticationFailed("token不存在") # token存在,验证token
user_obj = UserTable.objects.filter(token=token).first()
if user_obj:
# 验证通过,必须返回元组,(user,token)
return (user_obj,token)
# 认证不通过抛出异常
raise AuthenticationFailed("token错误")
# views.py

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import UserTable
import uuid
from utils.myauth import AuthoDemo
from rest_framework import authentication # Create your views here. # 注册视图
class RegisterView(APIView):
def post(self,request):
# 获取提交的用户名和密码
username = request.data.get('username')
password = request.data.get('password') # 创建对象
UserTable.objects.create(username=username,password=password) # 返回结果
return Response("注册成功!") # 登陆视图
class LoginView(APIView):
def post(self,request):
# 获取提交的用户名和密码
username = request.data.get('username')
password = request.data.get('password')
# 验证用户名密码是否正确
user_obj = UserTable.objects.filter(username=username,password=password).first()
if user_obj:
# 验证通过,写入Token并保存
token = uuid.uuid4()
user_obj.token = token # 为对象的token字段写入随机字符串
user_obj.save()
# 返回token
return Response(token)
else:
return Response("用户名密码不正确") # 认证的测试视图
class TestView(APIView):
authentication_classes = [AuthoDemo,]
def get(self,request):
print(request.user) # 获取用户对象
print(request.auth) # 获取token
print(request.user.username) # 获取用户对象的名字
return Response("认证测试接口")

源码流程

# 1、封装request对象
def dispatch(self, request, *args, **kwargs):
request = self.initialize_request(request, *args, **kwargs) # 1.1
def initialize_request(self, request, *args, **kwargs):
parser_context = self.get_parser_context(request)
return Request(
request,
parsers=self.get_parsers(),
# 返回认证类的实例化对象列表:[auth() for auth in self.authentication_classes]
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
) # 1.2
class APIView(View):
authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES from rest_framework import authentication # 查看自带的认证类 class ApiView(View):
# 2、认证组件
self.perform_authentication(request)
# 权限组件
self.check_permissions(request)
# 节流组件
self.check_throttles(request) # 2.1、开始认证
def perform_authentication(self, request):
request.user # 2.2、调用Request.user
class Request(object):
def __init__(self, request, authenticators=None):
self.authenticators = authenticators or () @property
def user(self):
if not hasattr(self, '_user'):
with wrap_attributeerrors():
# 2.3、
self._authenticate()
return self._user # 2.3、读取认证对象列表
def _authenticate(self):
for authenticator in self.authenticators:
try:
# 对每个进行验证,异常则全部终止,若返回None,则继续循环
user_auth_tuple = authenticator.authenticate(self) except exceptions.APIException:
self._not_authenticated()
raise if user_auth_tuple is not None:
# 给request赋值user
self._authenticator = authenticator
self.user, self.auth = user_auth_tuple
# 通过直接退出循环
return # 全都没有通过则设置匿名用户
self._not_authenticated() # 认证类实例
class BasicAuthentication(BaseAuthentication):
def authenticate(self, request):
"""
Returns a `User` if a correct username and password have been supplied
using HTTP Basic authentication. Otherwise returns `None`.
"""
pass
return self.authenticate_credentials(userid, password, request) def authenticate_credentials(self, userid, password, request=None):
"""
Authenticate the userid and password against username and password
with optional request for context.
"""
user = authenticate(request=request, **credentials) if user is None:
raise exceptions.AuthenticationFailed(_('Invalid username/password.')) if not user.is_active:
raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) return (user, None)
												

【DRF框架】认证组件的更多相关文章

  1. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  2. Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

    一.认证组件 使用方法: ①写一个认证类,新建文件:my_examine.py # 导入需要继承的基类BaseAuthentication from rest_framework.authentica ...

  3. DRF 之 认证组件

    1.认证的作用? 我们知道,当我们在网站上登陆之后,就会有自己的个人中心,之类的可以对自己的信息进行修改.但是http请求又是无状态的,所以导致我们每次请求都是一个新的请求,服务端每次都需要对请求进行 ...

  4. drf框架 - 过滤组件 | 分页组件 | 过滤器插件

    drf框架 接口过滤条件 群查接口各种筛选组件数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16 ...

  5. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  6. DRF之认证组件源码解析

    认证组件  认证的几种方法:cookie,session,token几种.但是session会使服务器的压力增大,所以我们经常使用的是token.获取唯一的随机字符串: 登陆携带token值的处理: ...

  7. DRF之认证组件、权限组件、频率组件使用方法总结

    认证组件格式: from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...

  8. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  9. Django rest-framework框架-认证组件的简单实例

    第一版 : 自己写函数实现用户认证 #models from django.db import models #用户表 class UserInfo(models.Model): user_type_ ...

  10. DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...

随机推荐

  1. 【Redis】Redis 事务

    Redis 事务介绍 Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败 ...

  2. TestDirector(TD)—测试管理工具

    简介 TestDirector是全球最大的软件测试工具提供商Mercury Interactive公司生产的企业级测试管理工具,也是业界第一个基于Web的测试管理系统,它可以在您公司内部或外部进行全球 ...

  3. VS2013+OpenCV3.4.2编译

    一.准备工作: (1)在OpenCV官网下载3.4.2版本(注意选择Win pack),https://opencv.org/releases.html. (2)下载Contrib模块,https:/ ...

  4. python tkinter中的事件绑定

    一个Tkinter主要跑在mainloop进程里.Events可能来自多个地方,比如按键,鼠标,或是系统事件. Tkinter提供了丰富的方法来处理这些事件.对于每一个控件Widget,你都可以为其绑 ...

  5. Linux中DHCP服务器的简单配置(转)

    我安装了两台linux系统,一个作为服务器,一个客户端 两个都有3个网卡, 后两个网卡聚合为zhi一个网卡:Linux 网卡聚合 两台电脑都一样. 那么如何为这个聚合网卡进行DHCP的分配呢? 1.由 ...

  6. 「模拟赛20191019」A 简单DP

    题目描述 给一个\(n\times m\)的网格,每个格子上有一个小写字母. 对于所有从左上角\((1,1)\)到右下角\((n,m)\)只向下或向右走的路径构成的集合,判断是否存在两条走法不同的路径 ...

  7. [转]综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation

    近期主要在学习语义分割相关方法,计划将arXiv上的这篇综述好好翻译下,目前已完成了一部分,但仅仅是尊重原文的直译,后续将继续完成剩余的部分,并对文中提及的多个方法给出自己的理解. _论文地址:htt ...

  8. Centos7下nginx的安装与配置

    说明:软件安装的基础目录路径:/usr/local 所以下载软件的时候切换到此目录下下载直接解压即可 1.安装gcc gcc-c++依赖包 yum install -y gcc gcc-c++ 2.下 ...

  9. 嵌入式02 STM32 实验02 端口输入输出各4种模式

    GPIO(General-purpose input/output 通用目的输入/输出端口) 电压(A模拟量)与电平(D数字量) GPIO 8种工作模式(输入四种.输出四种) 1.GPIO_Mode_ ...

  10. django settings.py 配置文件

    目录 settings.py 配置文件 settings.py 配置文件 import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.ab ...