首页 > 其他分享 >认证组件、权限组件、频率组件

认证组件、权限组件、频率组件

时间:2023-09-06 17:35:19浏览次数:34  
标签:登录 request 认证 token user 组件 import 权限 ###

认证组件

登录功能

写登录的时候,可以使用auth提供的user表,也可以自定义

===》自定义

写登录接口,登录成功,要有标志生成一个随机字符串,放在表中,以后他只要带这个随机字符串过来,我们就认为是这个人登录的

### ### ### ### ### ### ### 视图类### ### ### ### ### ### ### ### ### ### ### ### ###

from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import ViewSetMixin, ViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import User, UserToken
import uuid


# class UserView(ViewSetMixin,APIView):
class UserView(ViewSet):
    @action(methods=['POST'], detail=False) # /user/login/    post 请求就会执行
    def login(self, request, *args, **kwargs):
        # 前端传入用户名密码
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()

        if user:
            # 生成一个随机字符串,返回给前端,并且要把随机字符串存到token表中
            # 随机字符串使用uuid生成
            token = str(uuid.uuid4())
            # 把随机字符串存到token表中会有两种情况(如果之前没有登录过就是新增,如果之前登录过修改)
            # 先去UserToken表中,根据user查,如果能查到,就修改,查不到就新增一条记录
            ##### 方式一:麻烦方式
            # user_token=UserToken.objects.filter(user=user).first()
            # if user_token:
            #     user_token.token=token
            #     user_token.save()
            # else:
            #     UserToken.objects.create(user=user,token=token)

            ## 方式二:通过user去UserToken表中查,如果能查到用defaults的更新,如果查不到,就用user和defaults新增一条记录
            UserToken.objects.update_or_create(defaults={'token': token}, user=user)
            return Response({'code': 100, 'msg': '登录成功', 'token': token, 'username': user.username})

        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})

### ### ### ### ### ### ### 路由### ### ### ### 
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('user', UserView, 'user')

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)),
]

认证组件

认证有什么作用?

  一些接口,想限制登录后才能访问,没登录不能访问

  做登录认证,限制如果没登录,不允许访问该接口

drf中,认证如何使用?

  1. 写一个类,继承BaseAuthentication

  2. 类中重写:authenticate

  3. 在authenticate完成登录认证, 如果登录了。返回两个值,如果没登录抛异常

  4. 在视图类中配置使用

 class BookView(ViewSet):
            authentication_classes = [LoginAuth]

如果登录了,在视图类的方法中,能拿出当前登录用户

  request.user

auth.py

from .models import UserToken

'''
按照如下步骤写
1. 写一个类,继承BaseAuthentication
2. 类中重写:authenticate方法
3. 在authenticate完成登录认证,如果登录了,返回两个值,如果没登录抛异常
4. 在视图类中配置事宜
'''

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed

class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        # 如何知道当前请求这个人是登录了?
        # 拿到前端传入的token:当时给的随机字符串===》去UserToken表中查,如果能查到,说明就是这个人在访问,如果查不到,说明这个人没有登录过
        # 前端传入的token从哪拿?如何拿?===》后端定的:1 请求地址中  2. 请求体中  3. 请求头中
        token = request.query_params.get('token')
        user_token = UserToken.objects.filter(token=token).first()
        if user_token:  # 是登录状态
            return user_token.user, token  # 返回两个值,第一个是当前登录用户,第二个是前端token
        else:
            raise AuthenticationFailed('您没有登录')

视图类

from django.shortcuts import render

# Create your views here.

# 路由自动生成吗?    自动生成继承:ViewSetMixin   我想
# 要不要序列化,要不要跟数据库打交道,继承GenericAPIView:查出所有数据(只要一条),还要写个序列化类()
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import ViewSetMixin, ViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import User, UserToken
import uuid

from .auth import LoginAuth


# class UserView(ViewSetMixin,APIView):
class UserView(ViewSet):
    @action(methods=['POST'], detail=False)  # /user/login/    post 请求就会执行
    def login(self, request, *args, **kwargs):
        # 前端传入用户名密码
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()

        if user:
            # 生成一个随机字符串,返回给前端,并且要把随机字符串存到token表中
            # 随机字符串使用uuid生成
            token = str(uuid.uuid4())
            # 把随机字符串存到token表中会有两种情况(如果之前没有登录过就是新增,如果之前登录过修改)
            # 先去UserToken表中,根据user查,如果能查到,就修改,查不到就新增一条记录
            ##### 方式一:麻烦方式
            # user_token=UserToken.objects.filter(user=user).first()
            # if user_token:
            #     user_token.token=token
            #     user_token.save()
            # else:
            #     UserToken.objects.create(user=user,token=token)

            ## 方式二:通过user去UserToken表中查,如果能查到用defaults的更新,如果查不到,就用user和defaults新增一条记录
            UserToken.objects.update_or_create(defaults={'token': token}, user=user)
            return Response({'code': 100, 'msg': '登录成功', 'token': token, 'username': user.username})

        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})


class BookView(ViewSet):
    authentication_classes = [LoginAuth]  # 这个认证类,管理了当前类下所有的方法

    def list(self, request):
        print(request.user.username)  # 当前登录用户
        return Response("你好:%s,你看到了好多书啊"%request.user.username)

路由

from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('user', UserView, 'user')
router.register('books', BookView, 'books')
urlpatterns = [
    path('', include(router.urls)),
]

小结

1. 认证类要写好,使用

  配置在视图类上===》局部使用

  配置文件中配置===》全局使用===》所有接口都必须登录后才能用

    REST_FRAMEWORK = {
      'DEFAULT_AUTHENTICATION_CLASSES': [
      'app01.auth.LoginAuth'
      ],
      }

    局部禁用:

    class UserView(ViewSet)

      authentication_class = []

2. 写的认证类:

  要重写authenticate方法,必须返回两个参数:当前登录用户:user_token.user,用户的token ===》后续在视图类中:request.user 就是认证类返回的第一个参数,request.auth 就是认证类返回的第二个参数

3. 如果认证失败,抛异常AuthenticationFailed,会被drf捕获,处理,不会报错到前端

4. 前端传入的token,从哪取?

  后端定的,我们这个项目是从请求地址中取

  还可以从请求头或者请求体中取

5. UserToken.objects.update_or_create

权限组件

系统中:有普通用户,超级用户,超级管理员,他们都登录了,又分权限,有的人有权限,就能访问这个接口,没权限,就不能访问

'''
使用步骤:
1. 写一个类,继承 BasePermission
2. 重写 has_permission
3. 在方法中校验用户是否有权限,如果有,就返回True,如果没有,就返回False
    由于他的执行是在认证之后,所有从request.user中取出当前的用户,判断权限
4. 在视图类中局部使用,在settings中全局使用,局部可以禁用'''
    class PublishView(ViewSet):
        permission_classes = [UserPermission] 

    REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'app01.auth.LoginAuth'
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'app01.permissions.UserPermission',
    ],
}

视图类

from rest_framework.permissions import BasePermission


# 1 写一个类,继承 BasePermission
# 2 重写 has_permission
# 3 在方法中校验用户是否有权限,如果有,就返回True,如果没有,就返回False
# 4

class UserPermission(BasePermission):

    def has_permission(self, request, view):
        # request 当次请求的request,  新的,它是在认证类之后执行的,如果认证通过了request.user 就是当前登录用户
        # 拿到当前登录用户,查看它的类型,确定有没有权限
        if request.user.user_type == 3:

            return True
        else:
            self.message = '您的用户类型是:%s,您没有权限操作' % (request.user.get_user_type_display())
            return False

补充:Django项目国际化

# 配置文件中--->以后所有英文都会转成中文
INSTALLED_APPS = [
    'rest_framework'
]

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

频率组件

作用:控制一个接口一定时间段内的访问次数

对接口进行访问次数限制

# 使用步骤:
# 1. 写一个类,继承SimpleRateThrottle
# 2. 重写get_cache_key,返回什么,就以什么做限制:IP地址,用户id限制
3. 写一个类属性    scope = 'drf_day08'
# 4. 配置文件中配置
    '''
        'DEFAULT_THROTTLE_RATES': {
            'drf_day08': '3/m',  # 一分钟访问三次   5/s,m,h,d
        },
    '''
# 5. 局部使用,全局使用,局部禁用
class PublishView(ViewSet):
        throttle_classes = [IPRateThrottle]

# 6 全局使用
         'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.IPRateThrottle'],

视图类

from rest_framework.throttling import SimpleRateThrottle


# 1 写一个类,继承SimpleRateThrottle
# 2 重写get_cache_key,返回什么,就以什么做限制: IP地址,用户id限制
# 3 写一个类属性   scope = 'drf_day08'
# 4 配置文件中配置
'''
    'DEFAULT_THROTTLE_RATES': {
        'drf_day08': '3/m',  # 一分钟访问三次
    },
'''

# 5 局部使用,全局使用,局部禁用


class IPRateThrottle(SimpleRateThrottle):
    scope = 'drf_day08'  # 写一个类属性
    def get_cache_key(self, request, view):
        # 返回ip,以ip地址限制
        print(request.META)
        return request.META.get('REMOTE_ADDR')

排序

只有5个接口中的查询所有,才涉及到排序

使用步骤:

  1. 必须写在继承:GenericAPIView类的视图类中才行

  2. 配置类属性:

filter_backends = [OrderingFilter]
ordering_fields = ['id', 'user_tyoe']  # 可以排序的字段

  3. 使用:

  http://127.0.0.1:8000/user/?ordering=user_type #用户类型升序排
  http://127.0.0.1:8000/user/?ordering=-user_type #用户类型降序排
  http://127.0.0.1:8000/user/?ordering=user_type,-id#先按用户类型升序排,如果用户类型一样,再按id降序排

 

标签:登录,request,认证,token,user,组件,import,权限,###
From: https://www.cnblogs.com/zfq132/p/17682905.html

相关文章

  • 百度SpringBoot上传下载组件
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。 ......
  • DRF01---快速上手,请求的封装,版本管理,认证,权限
    1.3djangorestframework(上)djangorestframework(简称drf)本质上其实就是一个别人编写好的app,里面集成了很多编写restfulAPI的功能功能,接下里咱们就来学习drf并用他来开发restfulAPI。drf内置了很多便捷的功能,在接下来的课程中会给大家依次讲解下面的内容:快速上手请求的......
  • 百度开源上传下载组件
    ​ 需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify......
  • vue项目实录:下拉刷新组件的开发
    “下拉刷新”和“上滑加载更多”功能在前端、尤其是移动端项目中非常重要,这里笔者由曾经做过的vue项目中的“blink”功能和各位探讨下【下拉刷新】组件的开发:正式开篇在前端项目的components文件夹下新建pullRefreshView文件夹,在其中新建组件index.vue:(它代表“整个屏幕”,通过s......
  • vue3探索——使用ref与$parent实现父子组件间通信
    在vue3中,可以使用vue3的APIdefineExpose()函数结合ref或者$parent,实现父子组件数据的传递。子组件向父组件传递数据defineExpose()和ref子组件:通过defineExpose()函数,向外暴露响应式数据或者方法//src/components/son.vue<template><div><h1>儿子有${{so......
  • uniapp项目实践总结(十)自定义滑动触摸组件
    在APP的日常开放过程中,我们经常可以看到上拉刷新、下拉刷新、左滑、右滑、触底加载等效果,那其中的原理是如何呢,又是如何实现的呢,下面就一探究竟。这篇文章主要是讲述自定义滑动触摸组件的方放,兼容网页H5端、微信小程序端和App端。目录准备工作原理分析组件实现实战......
  • [MSSQL]开启/关闭Ad Hoc Distributed Queries组件
    SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowset/OpenDatasource”的访问开启组件:execsp_configure'showadvancedoptions',1reconfigureexecsp_configure'AdHocDistributedQueries',1reconfigure关闭组件:execsp_configur......
  • 探索PMP认证:为明天所有考试的朋友送上祝福
    亲爱的家人们,明天我们有些朋友要进行PMP考试,在这篇文章中,我们将深入了解PMP认证,这一在项目管理领域备受尊崇的认证,同时也送上我们最真诚的祝愿,愿他们的考试顺利通过!一、什么是PMP认证?PMP,即ProjectManagementProfessional的缩写,是由国际项目管理协会(ProjectManagementInstitute,......
  • 优化Docker权限管理:配置Docker用户组
    Docker利用Linux的用户和组权限来管理对Docker守护进程的访问权限。一般情况下,只有root用户和属于docker用户组的用户才被允许访问Docker守护进程。在Linux系统上使用Docker时,如果您尚未配置docker用户组,那么作为非root用户执行Docker相关命令将要求使用sudo......
  • 中国科教工作者协会与CCF PTA联合认证学习须知
    中国科教工作者协会与CCFPTA联合认证学习须知1、参与认证人员需在科技学堂(www.sciclass.cn)上进行课程学习,然后在PTA官网(pta.ccf.org.cn)报名并参加认证考试,考试及课程学习达标者,即可获得由中国青少年科技教育工作者协会与中国计算机学会联合颁发的认证证书。具体报名流程及认......