首页 > 其他分享 >认证-Authentication

认证-Authentication

时间:2022-12-12 17:35:40浏览次数:71  
标签:self request token 认证 Authentication user import

目录

认证Authentication

1、认证的写法

#认证的实现
 -1.写一个类,继承BaseAuthentication,重写authenticate,认证的逻辑写在里面,返回两个值,一个值最终给了Request对象的user,,如果认证失败就抛异常:AuthenticationFailed
 -2.全局使用,局部使用

2、认证的源码分析

# 1. APIView-----》dispatch方法-----》self.initial(request, *args, **kwargs)----》有认证,权限,频率
# 2.  只读认证源码 initial-----》 self.perform_authentication(request)

    def perform_authentication(self, request):
     	#去Resquest类中查找,方法属性user的get方法
        request.user
        
# 3. self.perform_authentication(request)就一句话:   request.user ,需要去drf的Request对象中找user属性(方法)
    class Request:
        @property
        def user(self):
            if not hasattr(self, '_user'):
                with wrap_attributeerrors():
                    
                    self._authenticate()
                    
            return self._user

# 4. Request类中的user方法,刚开始,没有_user,所以走self._authenticate()
	    @property
    def user(self):
        if not hasattr(self, '_user'):
            with wrap_attributeerrors():
                self._authenticate()
        return self._user
    
# 5. 核心 就是 Request类的_authenticate(self)
    def _authenticate(self):
        
        #遍历拿到一个个认证器,进行认证
        # self.authenticators配置的一堆认证类产生的认证类对象组成的list
        #self.authenticators在视图类中配置的一个个认证类: authentication_classes=[认证类1,认证类2],对象的列表
        #每次循环,拿到一个认证类的对象
        for authenticator in self.authenticators:
            try:
                #认证器(对象)调用认证方法authenticate(认证类对象self,request请求对象)
                #返回值:登录的用户与认证的信息组成的tuple
                #该方法被try包裹,代表该方法会抛异常,抛异常就代表认证失败
                user_auth_tuple = authenticator.authenticate(self)
            except exceptions.APIException:
                self._not_authenticated()
                raise

            if user_auth_tuple is not None:
                self._authenticator = authenticator
                #如何有返回值,就将登录用户 与 登录认证 分别保存到 request.user,request.auth
                self.user, self.auth = user_auth_tuple
                return
        #如果返回值user_auth_tuple为空,代表认证通过,但是没有 登录用户 与 登录认证信息,代表游客
        self._not_authenticated()

3、认证组件的使用

# 写一个认证类,app_auth.py,名字随意

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app01.models import UserToken

class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 认证逻辑,如果认证通过,返回两个值
        # 如果认证失败,抛出AuthenticationFailed
        token = request.GET.get('token')
        if token:
            user_token = UserToken.objects.filter(token=token).first()
            # 认证通过
            if user_token:
                return user_token.user,token
            else:
                raise AuthenticationFailed('认证失败')
        else:
            raise AuthenticationFailed('请求地址中需要携带token')


全局配置
#可以有多个认证,从左到右依次执行
#全局使用,在settings.py中配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        "app01.app_auth.MyAuthentication"
    ]
}

局部使用
#局部使用,在视图类上写
authentication_classes = [MyAuthentication]
#urls.py
from django.urls import path
from app01 import views
from rest_framework import routers

router = routers.SimpleRouter()
router.register(prefix='books', viewset=views.BookViewSet)
urlpatterns = [
    path('login/', views.LoginView.as_view()),
]
urlpatterns += router.urls


#views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action  # 装饰器
from app01.models import Book
from app01.serializer import BookSerializer
from app01.app_auth import MyAuthentication

class BookViewSet(ModelViewSet):
    
    authentication_classes = [MyAuthentication]
    
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    @action(methods=['get'], detail=False)
    def get_1(self, request):
        book_obj = self.get_queryset()[:2]  # 从0开始截取一条
        ser = self.get_serializer(book_obj, many=True)
        return Response(ser.data)

 
from rest_framework.views import APIView
from rest_framework.response import Response
from app01 import models
import uuid

class LoginView(APIView):
    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = models.User.objects.filter(username=username, password=password).first()
        if user:
            # 生成随机字符串
            res = uuid.uuid4()
            #存到usertoken表中
            # models.UserToken.objects.create(token=res,user=user)#用它每次登录都会存一条数据,不好,
            models.UserToken.objects.update_or_create(defaults={'token':res},user=user)
            return Response({'status': 100, 'msg': '登录成功', 'token':res})

        return Response({'status':101,'msg':'用户名或密码错误'})
局部禁用
#局部禁用
配置了全局后可以局部禁用
authentication_classes = []
class BookViewSet(ModelViewSet):
    authentication_classes = [MyAuthentication]
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    @action(methods=['get','post'], detail=False)
    def get_1(self, request):
        book_obj = self.get_queryset()[:2]
        ser = self.get_serializer(book_obj, many=True)
        return Response(ser.data)


class LoginView(APIView):
    authentication_classes = []

    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()
        if user:
            token = uuid.uuid4()
            UserToken.objects.update_or_create(defaults={'token': token}, user=user)
            return Response({'status': 100, 'msg': '登录成功', 'token': token})
        else:
            return Response({'status': 101, 'msg': '用户名或密码错误'})

image-20221209205742421

image-20221209205643076

标签:self,request,token,认证,Authentication,user,import
From: https://www.cnblogs.com/zaosong/p/16976693.html

相关文章

  • webstorm | Outdated | IDEA License Server Detected过期的问题(自己搭建认证服务器的
    自己搭建认证服务器的教程这里我只是个搬运工,归档员。方法一、具体的参加链接:​​http://idea.lanyus.com/​​自己根据上面的链接地址,可以自行构建自己的LicenseServer。......
  • 《云原生入门级开发者认证》学习笔记之云原生基础设施之容器技术
    写在前面嗯,报了考试,整理课堂笔记记忆学习的原因:虽然考了​​CKA​​​,了解了一些​​K8s​​相关的知识但是对​​云原生​​整个体系一直都很模糊希望对云原生有一个......
  • 亚马逊便携式火炉ASTM F3363-19认证标准
    亚马逊便携式火炉烧烤炉ASTMF3363-19认证标准烧烤炉是一种烧烤设备,可以用来做烤羊肉串、烤肉、烤蔬菜等烧烤食品。烧烤炉根据加热源的不同可以分为木炭烧烤炉、燃气烧......
  • 英国UKCA认证玩具测试报告
    什么是UKCA认证?UKCA是英国合格认定(UKConformityAssessed)的简称.2019年2月2日,英国公布了在无协议脱欧的情况下将会采用UKCA标志方案。2021年1月1日之后,开始正式实施新标......
  • SQLyog连接MYSQL时报错 Client does not support authentication protocol requested
    之前安装MYSQL8.0的时候安装的是绿色版,在cmd中配置完所有参数之后,在连接SQLyog的时候却报出了以下错误翻译一下大致的意思为:客户端不支持服务器请求的身份验证协议;考虑......
  • fastapi身份认证
    官方文档FastApi提供了OAuth2PasswordBearer类对OAuth2中的password授权模式提供了支持。一、实现逻辑创建OAuth2PasswordBearer实例并指明tokenurl(认证用户获取tok......
  • 获取Openstack认证令牌
    在运行身份管理服务的典型OpenStack部署中,可以指定用于认证的项目名、用户名和密码凭证。下面以使用cURL命令为例进行示范。(1)首先导出环境变量OS_PROJECT_NAME(项目名)、OS_......
  • 10:Java人脸识别认证-Java API 实战
    (目录)1.提出问题,引入SDK的概念什么是SDK?我们并不具备开发人脸识别的能力,但我们可以用大公司已经开发好的工具或者功能,来实现人脸识别,而大公司提供的就叫SDK(Software......
  • asp.net core 基于Cookies的认证,自定义认证方案
    前言:看完《ASP.NETCore6框架揭秘》很久了,这几天我发现自己对基于Cookie的认证还是有点疑惑,特别是自定义“认证方案”。所以写代码加强理解。别误会,我不会......
  • 上海ISO三体系认证办理常见流程
    ISO三体系认证是国际上标准化体系认证的结合,又称三标体系认证或三标一体,包括ISO9001质量管理体系、ISO14001环境管理体系、ISO45001职业安全健康管理体系。认证三体系标准已......