You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:12:08