DRF框架使用djangorestframework-simplejwt实现自定义用户类的token校验
时间: 2025-03-12 19:10:57 浏览: 86
<think>好的,用户的问题是关于在DRF框架中使用djangorestframework-simplejwt对自定义用户模型进行token验证的实现方法。我需要结合提供的引用内容,整理出一个清晰的步骤指南。
首先,我需要确认用户已经完成了自定义用户模型的创建,并且在settings.py中正确设置了AUTH_USER_MODEL。根据引用1,用户需要将AUTH_USER_MODEL设置为'app_name.CustomUser',比如'user.SysUser'。这一步是关键,因为Django的认证系统依赖于这个设置来识别自定义用户模型。
接下来,用户需要安装并配置djangorestframework-simplejwt。引用2提到在REST_FRAMEWORK的DEFAULT_AUTHENTICATION_CLASSES中添加JWTAuthentication。这样DRF就会使用JWT进行认证。同时,用户可能还需要配置SIMPLE_JWT的一些参数,比如令牌有效期,但这些在引用中没有详细说明,可能需要查阅官方文档补充。
然后,处理用户登录接口。引用4指出需要修改登录接口的路径,将默认的TokenObtainPairView替换为自定义的视图类,比如LoginView。这里可能需要用户自己创建这个视图类,继承自TokenObtainPairView,并重写validate方法,以支持自定义用户模型的验证逻辑。引用3提到导入自定义的MyTokenObtainPairView并添加到路由中,这可能是用户需要实现的部分,确保登录时使用正确的用户模型进行认证。
另外,生成token的部分,引用3提到需要自定义token生成逻辑,可能需要创建自定义的序列化器或视图来返回包含额外信息的token。例如,在自定义的MyTokenObtainPairView中,重写get_token方法,添加自定义的claims。
最后,用户需要在接口中进行权限验证,使用@authentication_classes和@permission_classes装饰器,或者在settings中全局配置,确保请求需要有效的JWT token才能访问。
需要注意的坑可能有:确保所有引用正确导入,自定义用户模型的字段是否符合JWT的要求,比如是否有username字段,或者是否需要修改认证后端。同时,用户可能需要处理密码验证、用户状态检查(如是否激活)等问题,这些在自定义的validate方法中需要实现。
总结步骤应该是:设置AUTH_USER_MODEL → 配置DRF和simplejwt → 自定义登录视图 → 生成包含用户信息的token → 配置路由 → 验证接口权限。需要确保每一步都正确无误,并参考提供的引用内容中的代码示例。</think>在DRF框架中使用djangorestframework-simplejwt实现自定义用户模型的token验证,可通过以下步骤实现:
### 一、基础配置
1. **设置用户模型**
在settings.py中声明自定义用户模型路径:
```python
AUTH_USER_MODEL = 'user.SysUser' # 格式为"应用名.模型类名"[^1]
```
2. **配置DRF认证类**
```python
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
# 其他配置...
}[^2]
```
### 二、登录接口改造
3. **创建自定义Token视图**
新建authentication.py文件,继承TokenObtainPairView:
```python
from rest_framework_simplejwt.views import TokenObtainPairView
from user.serializers import MyTokenObtainPairSerializer
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
```
4. **自定义Token生成逻辑**
在serializers.py中扩展Token声明:
```python
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['user_id'] = user.user_id # 添加自定义字段
token['dept_code'] = user.department.code
return token
```
### 三、路由配置
5. **修改登录接口路由**
```python
# urls.py
from .authentication import MyTokenObtainPairView
urlpatterns = [
path('login/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
# 其他路由...
][^3][^4]
```
### 四、接口验证
6. **添加权限验证装饰器**
在需要验证的视图类中添加:
```python
from rest_framework.decorators import authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated
@authentication_classes([JWTAuthentication])
@permission_classes([IsAuthenticated])
def protected_view(request):
# 业务逻辑...
```
### 需要注意的坑
- 确保自定义用户模型继承自`AbstractBaseUser`和`PermissionsMixin`
- 若自定义了用户名字段(非username),需在序列化器中重写`username_field`配置
- JWT的payload默认有效期为5分钟,可在`settings.py`中通过`SIMPLE_JWT`配置项调整
阅读全文
相关推荐


















