Django REST Framework中除AUTH_USER_MODEL之外的用户模型

Use*_*ser 8 python django django-rest-framework

我有一个架构问题.我正在使用Django(使用管理面板)和DRF(使用JWT进行无状态身份验证的api).

Django具有由模型表示的Admin用户,该用户与默认的Django用户模型大致相同.管理员仅使用Django Admin,不能使用DRF api.

DRF有API用户,只允许通过DRF使用api,不能与Django Admin或Django Session等交互.

我知道最好的方法是使用多模型继承,如:

class User(DjangoUserModel):
    pass

 class Admin(User):
      pass

 class API(User):
      pass

AUTH_USER_MODEL = "User"
Run Code Online (Sandbox Code Playgroud)

但问题是,那些用户完全不同.例如:API用户具有复杂的复合键作为用户名字段,这与简单的Admin用户名字段无法组合.还有很多其他的差异...

问题是:我可以使用不是AUTH_USER_MODELDRF实例的用户对象吗?所以self.request.user将存储一个没有以任何方式连接的模型实例AUTH_USER_MODEL.你们有没有做过类似的事情?

Gal*_*man 5

嗯,是的,先生。你可以这样做。看下面的例子

from rest_framework_jwt.authentication import JSONWebTokenAuthentication

class AuthenticatedServiceClient:
    def is_authenticated(self):
        return True

class JwtServiceOnlyAuthentication(JSONWebTokenAuthentication):
    def authenticate_credentials(self, payload):
        # Assign properties from payload to the AuthenticatedServiceClient object if necessary
        return AuthenticatedServiceClient()
Run Code Online (Sandbox Code Playgroud)

在 settings.py 中:

REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None,
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'myapp.authentication.JwtServiceOnlyAuthentication',
    ),
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以DEFAULT_AUTHENTICATION_CLASSES为 DRF定义附加内容。身份验证类就像中间件,只是一个正在填充的队列request.user

添加您自己的使用不同用户模型的身份验证类AUTH_USER_MODEL将与您完全一样工作,除了。