拋棄 Django 自帶用戶管理后,能否使用 simple-jwt
?
一、結論
是的,即使拋棄了 Django 自帶的用戶管理(AbstractUser
或 AbstractBaseUser
),仍然可以使用 django-rest-framework-simplejwt
(簡稱 simple-jwt
)來進行 JWT 認證。但需要進行 額外配置,確保 simple-jwt
能識別和處理你的自定義用戶模型。
二、Django 用戶管理的作用
Django 自帶的用戶管理提供:
AbstractUser
/AbstractBaseUser
作為默認用戶模型。django.contrib.auth
認證系統,如authenticate()
、login()
、logout()
。- 默認的
User
模型,用于管理權限、組等。
如果你完全拋棄 Django 的用戶管理(如不繼承 AbstractUser
),你需要:
- 自定義用戶模型
- 自定義
simple-jwt
的用戶解析邏輯 - 手動實現
authenticate()
邏輯
三、如何自定義 JWT 認證
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
邏輯。🚀