个人博客系列-后端项目-用户验证(5)

介绍

创建系统管理app,用于管理系统的用户,角色,权限,登录等功能,项目中将使用django-rest_framework进行用户认证和权限解析。这里将完成用户认证

用户验证

rest_framework.authentication模块中的认证类,例如:
session认证:SessionAuthentication(基于session)
token 认证:TokenAuthentication(API Token)
自定义认证:BasicAuthentication(HTTP Basic Auth)

  1. 这里采用djangorestframework-simplejwt设计自定义认证类和自定义登录
pip install djangorestframework-simplejwt
  1. 创建用户模型表user
from django.db import models from django.contrib.auth.hashers import make_password, check_password# Create your models here.class User(models.Model):username = models.CharField(max_length=255, unique=True, verbose_name="手机号")password = models.CharField(max_length=255, unique=False, verbose_name="密码")is_vip = models.BooleanField(default=False,verbose_name="是否为vip")vip_expires_at = models.DateTimeField(auto_now_add=True,verbose_name="vip过期时间")is_active = models.BooleanField(default=True)class Meta:db_table = "user"verbose_name = "用户账号表"verbose_name_plural = verbose_name
  1. 数据库迁移
python manage.py makemigrations
python manage.py migrate 
  1. 在根目录下创建utils目录,在utils目录中创建文件Authentication.py和jwt.py
 ## Authentication.pyfrom rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework import serializers
from user.models import User# 自定义认证类
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):"""自定义登录认证,使用自有用户表username、password这两个字段为必传字段因为 DRF 要检查这些字段是否有效username_field = 'phone_number'  这是重命名了,username必传字段设置为了phone_number字段必传phone_number = serializers.CharField(required=False) # 这个是设置了自定义的字段是否必传"""def validate(self, attrs):username = attrs.get("username")password = attrs.get("password")if not username or not password:raise serializers.ValidationError("phone_number and password are required")try:user = User.objects.get(username=username, password=password)except User.DoesNotExist:raise serializers.ValidationError("No user found with this username and password.")print(user)refresh = self.get_token(user)data = {"userId": user.id, "token": str(refresh.access_token), "refresh": str(refresh),'is_vip': user.is_vip}return dataclass MyTokenObtainPairView(TokenObtainPairView):serializer_class = MyTokenObtainPairSerializer
## jwt.py
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.exceptions import InvalidToken, AuthenticationFailed
from django.utils.translation import gettext_lazy as _
# 自定义的用户模型
from user.models import Userclass MyJWTAuthentication(JWTAuthentication):'''修改JWT认证类,返回自定义User表对象'''def get_user(self, validated_token):try:user_id = validated_token['user_id']except KeyError:raise InvalidToken(_('Token contained no recognizable user identification'))try:user = User.objects.get(**{'id': user_id})except User.DoesNotExist:raise AuthenticationFailed(_('User not found'), code='user_not_found')return user
  1. 在settings.py同级目录下创建drf_settings.py 并引入settings.py 中
## drf_settings.py
REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',],'DEFAULT_AUTHENTICATION_CLASSES': ['utils.jwt.MyJWTAuthentication' # 认证方式为自定义的认证类],
}

引入settings中

import drf_settings
REST_FRAMEWORK = drf_settings.REST_FRAMEWORK
  1. 创建一个app:userauth,在views.py中写入一个接口视图
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response# Create your views here.class UserTestView(APIView):def post(self, request,*args, **kwargs):s = str(request.user.__dict__)return Response(s)
  1. 在app:userauth:urls中设置路由
from django.urls import path, include
from rest_framework import routers
from rest_framework_simplejwt.views import TokenVerifyView, TokenRefreshView
from utils.authentication import MyTokenObtainPairView
from userauth.views import UserTestViewrouter = routers.DefaultRouter()urlpatterns = [path("login/", MyTokenObtainPairView.as_view()),                           # 登录path("refresh/", TokenRefreshView.as_view(), name="token_refresh"),        # 刷新tokenpath("verify/", TokenVerifyView.as_view(), name="token_verify"),            # 验证tokenpath("test/", UserTestView.as_view(), name="test")
]
urlpatterns.append(path('', include(router.urls)))
  1. 这里没有写注册功能,所以只有手动在数据库中创建一个用户
    在这里插入图片描述

  2. 使用postman进行登录测试
    在这里插入图片描述

  3. 刷新token测试
    在这里插入图片描述

  4. 接口测试
    在这里插入图片描述

参考链接:https://blog.csdn.net/qq_42410176/article/details/130568130?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/273891.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

升级ChatGPT4.0失败的解决方案

ChatGPT 4.0科普 ChatGPT 4.0是一款具有多项出众功能的新一代AI语言模型。以下是关于ChatGPT 4.0的一些关键特点和科普内容: 多模态:ChatGPT 4.0具备处理不同类型输入和输出的能力。这意味着它不仅可以接收文字信息,还能处理图片、视频等多…

基于springboot+vue的旅游管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

简单接入电商API接口|轻松实现实时采集淘宝、抖音、快手、1688商品,挖掘潜力款

今天给大家带来一款非常实用的电商API接口,这款数据采集接口支持淘宝采集、抖音采集、快手采集、1688采集以及潜力款分析,功能强大,助您在电商领域更上一层楼。 首先,我们来了解一下淘宝采集功能。作为国内最大的电商平台&#xf…

UI学习 一

教程:Accessibility – Material Design 3 需要科学上网,否则图片显示不出来。设计教程没有图片说明,不容易理解。 优化UI方向 清晰可见的元素足够的对比度和尺寸重要性的明确等级一眼就能辨别的关键信息 传达某一事物的相对重要性 将重…

AI会砸了我们的饭碗?

Sora,由OpenAI推出,是一款创新的文本到视频生成模型。它能够将文本描述转化为引人入胜的高清视频片段。采用了扩散模型和变换器架构,Sora实现了高效的训练。其方法包括统一表示法、基于补丁的表示法、视频压缩网络和扩散变换器。 Sora具备多种…

就业班 2401--3.11 Linux Day15--ftp数据传输测试server和client+谷歌验证码登录远程连接

文件服务器 路漫漫其修远兮,吾将上下而求索.构建NFS远程共享存储 一、NFS介绍 文件系统级别共享(是NAS存储) --------- 已经做好了格式化,可以直接用。 速度慢比如:nfs,sambaNFS NFS:Networ…

硬件工程师面试题梳理-百度硬件面试题

硬件工程师基本职责 在公司里面,硬件工程师的主要职责包括设计、开发和测试硬件系统,以满足产品需求和性能要求。他们负责确保硬件系统的可靠性、稳定性和可维护性,并与软件工程师和其他团队成员合作,以确保硬件和软件的协同工作…

网络攻防中nginx安全配置,让木马上传后不能执行、让木马执行后看不到非网站目录文件、命令执行后权限不能过高

网络攻防中nginx安全配置,让木马上传后不能执行、让木马执行后看不到非网站目录文件、命令执行后权限不能过高。 0x01 Nginx介绍 nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。nginx一般是把请求发…

【SpringCloud微服务实战03】Nacos 注册中心

一、Nacos安装 官方文档安装Nacos教程:Nacos 快速开始 这里安装的是1.4.7版本,安装之后访问http://127.0.0.1:8848/nacos 管理界面如下:(用户名:nacos,密码:nacos) 二、Nacos服务注册和发现 1、在父工程中配置文件pom.xml 中添加spring-cloud-alilbaba的管理依赖:…

web基础05-jQuery

目录 一、jQuery 1.概述 2.原生js与jQuery对比 3.特点 4.使用 (1)入口函数 (2)语法 (3)jQuery选择器 5.方法 (1)获取属性值: (2)删除属…

校园外卖创业中的信息差,了解这些创业不迷路

外卖已经成为大学生日常生活的重要组成部分,但大部分高校对外卖都有着严格的管理,外卖取餐不便、配送时间过长、拿错餐等问题频出,基于此校园外卖创业成了高校市场的热门项目。 本文就校园外卖创业中存在的信息差展开分析,帮你理…

【MySQL】-知识点整理

1、存储引擎 -- 查询数据库支持的存储引擎 show engines; -- 查询当前数据库使用的存储引擎 show variables like %storage_engines%; 主要的存储引擎说明: 1)MyISAM:无外键、表锁、所有索引都是非聚簇索引、无事务、记录表总条数、删除表…

Linux最小系统安装无法查看IP地址

1,出现原因 服务器重启完成之后,我们可以通过linux的指令 ip addr 来查询Linux系统的IP地址,具体信息如下: 从图中我们可以看到,并没有获取到linux系统的IP地址,这是为什么呢?这是由于启动服务器时未加载网…

【MySQL系列 05】Schema 与数据类型优化

良好的数据库 schema 设计和合理的数据类型选择是 SQL 获得高性能的基石。 一、选择优化的数据类型 MySQL 支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择。 1. …

数据通信练习题

1.0osi七层模型 应用层 data 表示层 会话层 传输层 数据段 防火墙,端口(TCP UDP) 网络层 数据包 路由器 数据链路层 数据帧 交换机 物理层 比特流 网卡 2.IP地址分类 私有地址 A类 0--127 10.0.0.0…

提升日志管理效率:掌握CKA认证中的边车容器技巧

往期精彩文章 : 提升CKA考试胜算:一文带你全面了解RBAC权限控制!揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?CKA认证必备:掌握k8s网络策略的关键要点提高CKA认证成功率,CKA真题中的节点维…

C++字符串操作【超详细】

零.前言 本文将重点围绕C的字符串来展开描述。 其中,对于C/C中字符串的一些区别也做出了回答,并对于C的(string库)进行了讲解,最后我们给出字符串的不同表达形式。 开发环境: VS2022 一.字符串常量跟字…

光伏数字化管理平台:驱动绿色能源革命的智能化引擎

随着全球对可再生能源需求的不断增长,光伏产业已经成为推动绿色能源革命的重要力量。在这个背景下,光伏数字化管理平台应运而生,以其强大的数据处理、实时监控和智能优化功能,为光伏电站的运营管理和维护带来了革命性的变革。 光伏…

如何正确选择国外服务器的带宽和线路呢?

国外大带宽服务器是一种提供高带宽、高速网络连接和良好稳定性的服务器,但在中国使用这类服务器可能涉及到违反法律法规的风险。因此我无法为你提供相关帮助。接下来和源库一起了解如何正确选择国外服务器的带宽和线路呢? 考虑目标用户的地理位置。如果目标用户主要…

SpringBoot注解--08--注解@JsonInclude

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JsonInclude注解是jackSon中最常用的注解之一,是为实体类在接口序列化返回值时增加规则的注解 1.JsonInclude用法2.JsonInclude注解中的规则有 案例需求…