【后端】【django】抛弃 Django 自带用户管理后,能否使用 `simple-jwt`?

devtools/2025/3/19 1:47:58/

抛弃 Django 自带用户管理后,能否使用 simple-jwt

一、结论

是的,即使抛弃了 Django 自带的用户管理AbstractUserAbstractBaseUser),仍然可以使用 django-rest-framework-simplejwt(简称 simple-jwt)来进行 JWT 认证。但需要进行 额外配置,确保 simple-jwt 能识别和处理你的自定义用户模型。


二、Django 用户管理的作用

Django 自带的用户管理提供:

  1. AbstractUser / AbstractBaseUser 作为默认用户模型。
  2. django.contrib.auth 认证系统,如 authenticate()login()logout()
  3. 默认的 User 模型,用于管理权限、组等。

如果你完全抛弃 Django 的用户管理(如不继承 AbstractUser),你需要:

  • 自定义用户模型
  • 自定义 simple-jwt 的用户解析逻辑
  • 手动实现 authenticate() 逻辑

三、如何自定义 JWT 认证

djangorestframeworksimplejwt_21">1. 安装 djangorestframework-simplejwt
pip install djangorestframework-simplejwt
2. 在 settings.py 进行基础配置
INSTALLED_APPS += ["rest_framework_simplejwt"]REST_FRAMEWORK = {"DEFAULT_AUTHENTICATION_CLASSES": ("rest_framework_simplejwt.authentication.JWTAuthentication",)
}
3. 自定义用户模型

如果你不使用 Django 默认的 User,可以创建自己的 CustomUser 模型:

from django.db import modelsclass CustomUser(models.Model):id = models.AutoField(primary_key=True)username = models.CharField(max_length=255, unique=True)email = models.EmailField(unique=True)password = models.CharField(max_length=255)is_active = models.BooleanField(default=True)def __str__(self):return self.username
4. 自定义 get_user_model()

由于 Django 默认的 get_user_model() 依赖 AbstractUser,如果完全抛弃 Django 用户管理,你可以手动指定用户模型

from myapp.models import CustomUserdef get_custom_user(identifier):"""支持使用用户名或邮箱获取用户"""try:return CustomUser.objects.get(username=identifier)except CustomUser.DoesNotExist:try:return CustomUser.objects.get(email=identifier)except CustomUser.DoesNotExist:return None
5. 自定义 JWTAuthentication

因为 simple-jwt 默认使用 Django 自带的 User,你需要自定义 JWTAuthentication 来适配 CustomUser

from rest_framework_simplejwt.authentication import JWTAuthenticationclass CustomJWTAuthentication(JWTAuthentication):def get_user(self, validated_token):try:user_id = validated_token.get("user_id")return CustomUser.objects.get(id=user_id)except CustomUser.DoesNotExist:return None

然后在 settings.py 替换 DEFAULT_AUTHENTICATION_CLASSES

REST_FRAMEWORK = {"DEFAULT_AUTHENTICATION_CLASSES": ("path.to.CustomJWTAuthentication",)
}
6. 自定义 Token 生成视图

由于 simple-jwt 默认使用 User 进行认证,你需要自定义 Token 生成逻辑

from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from django.contrib.auth.hashers import check_passwordclass CustomTokenObtainPairSerializer(TokenObtainPairSerializer):def validate(self, attrs):username = attrs.get("username")password = attrs.get("password")user = get_custom_user(username)if not user or not check_password(password, user.password):raise serializers.ValidationError("用户名或密码错误")data = super().validate(attrs)return dataclass CustomTokenObtainPairView(TokenObtainPairView):serializer_class = CustomTokenObtainPairSerializer

然后在 urls.py 里注册:

from django.urls import path
from path.to.views import CustomTokenObtainPairView
from rest_framework_simplejwt.views import TokenRefreshViewurlpatterns = [path("api/token/", CustomTokenObtainPairView.as_view(), name="token_obtain_pair"),path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
]

四、总结

方案需要修改
直接使用 Django User无需修改,默认支持 simple-jwt
继承 AbstractUser支持 simple-jwt,只需 settings.AUTH_USER_MODEL
完全自定义用户模型需要手动适配 JWTAuthentication,重写 TokenObtainPairSerializer
推荐方案
  • 如果只是调整 User 字段,建议继承 AbstractUser,这样 simple-jwt 仍然可用
  • 如果完全自定义用户模型,必须手动适配 simple-jwt

总之,抛弃 Django 的 User 仍然可以使用 simple-jwt,但需要额外开发 JWTAuthentication 逻辑。🚀


http://www.ppmy.cn/devtools/168207.html

相关文章

Java中接口隔离原则简介和代码举例

简介: 接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计SOLID原则中的“I”,其核心思想是: 定义 客户端不应被迫依赖它不使用的方法。即,一个类对另一个类的依赖应建立在最…

软考中级-数据库-4.4 文件管理与作业管理

主要考点 文件管理: 1、文件的结构和组织 2、文件的目录结构 3、文件存储空间的管理 4、作业调度算法 文件的结构和组织 • 文件的逻辑结构:从用户角度看到的文件组织形式就是文件的逻辑结构,但实际上这些文件在内存上的存放方式可能并不是这…

Hyperlane:轻量、高效、安全的 Rust Web 框架新选择

Hyperlane:轻量、高效、安全的 Rust Web 框架新选择 在 Web 开发的世界中,框架的选择往往决定了项目的效率与未来。Hyperlane,一款基于 Rust 语言打造的轻量级 Web 框架,正以其卓越的性能、简洁的设计和可靠的安全性,…

WEB安全--SQL注入--DNSlog外带

一、原理: 访问域名时,dns协议将我们访问的语句解析为ip地址,并将其记录在其日志中;在这个过程中,如果我们在语句中写入SQL注入的语句,那么在dns解析时会执行这些语句并通过concat将结果和域名一起记录在日…

动作捕捉手套如何让虚拟现实人机交互 “触手可及”?

在虚拟与现实逐渐交融的当下,动作捕捉技术正以前所未有的速度革新着多个领域。 动作捕捉技术,简称“动捕”,已经从早期的影视特效制作,逐步拓展到游戏开发、虚拟现实、机器人控制等多个领域。 而mHandPrO数据手套作为这一领域的…

汉桑科技IPO:潜藏两大风险 公众投资者权益或受损

冰山之所以危险,是因为只有八分之一在水面上。 ——语出小说家海明威。 引 言 野村证券提供的一份报告显示,2025年前两个月,我国出口同比增长仅有2.3%,与去年四季度9.9%的增长显著下滑。与此同时,从2月1日开始&a…

技术栈分享之----Swagger

一:swagger介绍 相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用…

【mysql】不允许来自主机的链接错误解决方案

错误信息 FHost 192.168.1.214 is not allowed to connect to this MySQL server 检查是否存在用户权限 SELECT user, host FROM mysql.user; 创建用户权限 CREATE USER root192.168.1.214 IDENTIFIED BY yourpassword; 更新用户权限 ALTER USER root192.168.1.214 IDEN…