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

news2025/1/18 13:55:07

介绍

创建系统管理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.py
 from 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 data

class 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 User


class 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 UserTestView

router = routers.DefaultRouter()


urlpatterns = [
    path("login/", MyTokenObtainPairView.as_view()),                           # 登录
    path("refresh/", TokenRefreshView.as_view(), name="token_refresh"),        # 刷新token
    path("verify/", TokenVerifyView.as_view(), name="token_verify"),            # 验证token
    path("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.coloradmin.cn/o/1496410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python实现银行卡识别

在本文中将介绍如何使用Python和深度学习技术来实现银行卡识别功能。银行卡识别是一个在金融、安全等领域具有重要应用的问题,将使用深度学习模型来实现银行卡图像的识别和分类。 目录 引言数据集准备预处理和特征提取模型选择与训练模型评估与性能优化部署与应用 引…

怎么做加密文件二维码?分享文件更安全

怎么做一个加密文件二维码?在日常的工作和生活中,通过扫描二维码来查看或者下载文件的方式,被越来越多的人所使用,一方面是二维码的成本低,另一方面有利于提升便捷性和用户体验。 为了保证内容的隐私性和安全性&#…

Linux学习笔记——基本操作命令

目录 一、Shell 命令基础1、Shell 简介2、Shell 命令格式3、显示系统信息命令4、Shell 使用技巧 二、Linux 文件及目录管理1、Linux操作系统的目录结构2、文件及目录显示类命令3、文件及目录操作类命令4、文件内容的显示和处理5、文件查找类命令 三、vi、vim 编辑器的使用四、文…

以太网帧格式

以太网帧格式 以太网帧格式前导码(Preamble)帧起始界定符(SFD,Start Frame Delimiter)以太网帧头目的MAC地址源MAC地址长度/类型 数据段帧检验序列(FCS,Frame Check Sequence)帧间隙…

Vue全家桶:vue2+vue3全部搞懂:第八篇,重要!正式工程化项目开发——开始怎么写代码

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,不然不好懂 这一专栏知识将一次性将vue、vue2、vue3全部讲明白 这一篇内容蛮多,我本人也打算加快学习速度,于是下面大量解释将出自于黑马程序员的视频课堂截图&…

Java面试篇【RabbitMQ】常见面试题(2024最新)

RabbitMQ 1.为什么使用MQ?优点是什么 因为MQ可以异步处理,提高系统吞吐量。 应用解耦,系统之间可以通过消息通信,不关心其他系统的处理。 流量削峰,可以通过消息队列的长度,控制请求量。可以缓解短时间内的高并发请…

热插拔更换ESXI宿主机系统硬盘导致紫屏故障案例一则

关键词 vmware、esxi5.5raid、热插拔、紫屏 华为 CH121V3刀片、SSD硬盘 There are many things that can not be broken! 如果觉得本文对你有帮助,欢迎点赞、收藏、评论! 一、问题现象 现网vmware云平台一台华为E9000刀箱CH121V3刀片服务…

16-Java命令模式 ( Command Pattern )

Java命令模式 摘要实现范例 命令模式(Command Pattern)中请求以命令的形式包裹在对象中,并传给调用对象 调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令 命令模式是行为型模式&…

面试官让说出8种创建线程的方式,我只说了4种,然后挂了。。。

写在开头 昨天有个小伙伴私信说自己面试挂在了“Java有几种创建线程的方式”上,我问他怎么回答的,他说自己有背过八股文,回答了:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池这四种,但是面试官让说…

艺术与科技的结合,AI绘画图生图怎么样?

AI绘画图生图是指通过人工智能技术生成的具有艺术价值的图像。它可以根据用户提供的参考图像或描述,自动生成具有艺术风格的新图像。这些图像可以是风景、人物、抽象画等各种形式。那么ai绘画图生图到底怎么样? AI绘画图生图的优点在于它可以快速、高效地…

产品展示型wordpress外贸网站模板

孕婴产品wordpress外贸网站模板 吸奶器、待产包、孕妇枕头、护理垫、纸尿裤、孕妇装、孕婴产品wordpress外贸网站模板。 https://www.jianzhanpress.com/?p4112 床品毛巾wordpress独立站模板 床单、被套、毛巾、抱枕、靠垫、围巾、布艺、枕头、乳胶枕、四件套、浴巾wordpre…

【学习】DenseNet

DenseNet介绍 DenseNet模型的基本思路与ResNet一致,但它建立的是前面所有层与后面层的密集连接(即相加变连结),它的名称也是由此而来。DenseNet的另一大特色是通过特征在通道上的连接来实现特征重用。这些特点让DenseNet的参数量…

C# CallerMemberName、CallerFilePath、CallerLineNumber

CallerMemberName:调用某个方法的主方法名称 CallerFilePath:调用某个方法的主方法所在的类文件地址 CallerLineNumber:调用这个方法所在的行号 用这三个附加属性,需要设置默认值。

推荐5款极具效率的实用工具软件

​ 每次分享实用的软件,都会给人一种踏实和喜悦的感觉,这也是我热衷于搜集和推荐高效工具软件的原因。 1.个人日记软件——EDiary ​ EDiary是一款功能丰富的个人日记软件,用户可以在不联网的状态下使用,保护隐私。它支持日记、记事本、日历、事件提醒…

QT----云服务器部署Mysql,Navicat连接1698 -Access denied for user ‘root‘@‘‘

阿里云有活动,白嫖了一年的新加坡轻量级服务器,有点卡,有时候要开梯子 白嫖300元优惠券 目录 1 安装启动Mysql服务2 更改连接权限2.1 Navicat连接报错1698 -Access denied for user root 3 qt连接云服务器数据库 1 安装启动Mysql服务 我使用…

Docker-部署若依项目

文章目录 后端一、搭建局域网二、redis安装测试 三、MySQL安装四、后端项目放入位置及使用Dockerfile自定义镜像后端项目放入位置 前端配置检查各个端口是否启动nginx部署 首先得先把内部的文件给删除清空 docker images–查看有哪些文件 docker rmi -f ID–删除ID 后端 一、…

linux 安装OpenRestry

一、OpenRestry官网 openRestry中文官网 openRestry英文官网 二、OpenRestry搭建 可以参考官方提供的网址进行搭建:OpenRestry安装官网 ​ 三、开始安装 1、安装依赖库 yum install libtermcap-devel ncurses-devel libevent-devel readline-devel pcre-deve…

Docker 创建容器并指定时区

目录 1. 通过环境变量设置时区(推荐)2. 挂载宿主机的时区文件到容器中3. 总结 要在 Docker 容器中指定时区,可以通过两种方式来实现: 1. 通过环境变量设置时区(推荐) 在 Docker 运行时,可以通…

简析:老阳分享的视频号带货蓝海项目前景如何?

随着社交媒体的快速发展,视频号带货已经成为电商领域的一大热点。近期,知名网红老阳分享了自己的视频号带货项目,引发了广泛关注。本文将从视频号前景、注意事项等方面,分析老阳分享的视频号带货项目前景如何。 首先,从…

三维GIS的业务导向

的确,目前三维GIS以做特效居多,酷炫、亮眼,从二维转到三维,第一眼就给人眼前一亮的感觉,就凭这一项,很多客户就会买单,GIS的客户以政府、科研院所、特种行业为主,买过一次单后&#…