能否让Django OAuth Toolkit使用非AUTH_USER_MODEL的自定义用户模型?
可行,具体实现步骤如下
自定义OAuth2认证后端
继承Django OAuth Toolkit的OAuth2Backend,重写authenticate方法,让它查询你指定的非默认用户模型,而非settings.AUTH_USER_MODEL。示例代码:from oauth2_provider.backends import OAuth2Backend from yourapp.models import CustomOAuthUser # 你的自定义用户模型 class CustomOAuth2Backend(OAuth2Backend): def authenticate(self, request, username=None, password=None, **kwargs): try: user = CustomOAuthUser.objects.get(username=username) if user.check_password(password): return user except CustomOAuthUser.DoesNotExist: return None配置OAuth Toolkit使用自定义后端
在项目settings.py中添加配置,指定OAuth认证流程使用你自定义的后端:OAUTH2_PROVIDER = { 'USER_AUTHENTICATION_BACKEND': 'yourapp.backends.CustomOAuth2Backend', }自定义令牌模型(可选,若需令牌关联自定义用户)
如果需要让OAuth令牌直接关联你的自定义用户模型,需重写AccessToken等模型,替换默认的外键指向:from django.db import models from oauth2_provider.models import AbstractAccessToken from yourapp.models import CustomOAuthUser class CustomAccessToken(AbstractAccessToken): user = models.ForeignKey(CustomOAuthUser, on_delete=models.CASCADE, related_name='oauth2_access_tokens') class Meta(AbstractAccessToken.Meta): pass随后在settings中指定自定义模型:
OAUTH2_PROVIDER = { # 其他原有配置 'ACCESS_TOKEN_MODEL': 'yourapp.models.CustomAccessToken', }保留后台默认认证逻辑
项目默认的AUTHENTICATION_BACKENDS依然保留django.contrib.auth.backends.ModelBackend,确保后台管理系统继续使用默认用户模型完成认证。
注意:如果你的自定义用户模型未遵循Django用户模型的核心规范(比如没有username字段、check_password方法),需要在自定义后端中调整认证逻辑,适配你的模型字段和方法。
内容的提问来源于stack exchange,提问作者janetatomas11
相关产品推荐
相关产品推荐

