AUTH以外的用户模型

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

Django的管理员用户使用的模型与默认的Django用户模型差不多。 管理员只能使用Django Admin,不能使用DRF api。

DRF拥有允许通过DRF使用API​​的API用户,并且不能与Django Admin或Django Session等进行交互。

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

class User(DjangoUserModel):
    pass

 class Admin(User):
      pass

 class API(User):
      pass

AUTH_USER_MODEL = "User"

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

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


好吧,先生。 你可以做到这一点。 看看下面的例子:

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()

在settings.py中:

REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None,
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'myapp.authentication.JwtServiceOnlyAuthentication',
    ),
}

如果你愿意,你可以为你的DRF定义额外的DEFAULT_AUTHENTICATION_CLASSES 。 认证类就像中间件一样,只是一个填充request.user的队列。

AUTH_USER_MODEL添加使用不同用户模型的自己的身份验证类将完全按照您的需要进行工作。


由于您使用的是Django和DRF,因此也许您可以编写一个APIUser模型,该模型可以根据您的定制扩展自AbstractBaseUser ,编写自定义身份验证类并将其插入到REST_FRAMEWORK.DEFAULT_AUTHENTICATION_CLASSES设置中。 django管理员单独留下AUTH_USER_MODEL。

您的自定义身份验证可能只需要重写authenticate_credentials (我在DRF github中引用了TokenAuthentication类)并返回APIUser,而不是在settings.AUTH_USER_MODEL定义的默认值。 这会有点不同,因为你正在解码一个JWT,所以你可能会从JWT中提取一些信息,并以你需要的任何方式查找你的APIUser,比如你的复合字段。 这应该会导致self.request.user成为DRF API视图的APIUser。

您的API视图应该使用其余框架的设置,并且您的Django管理员应该使用常规的django设置。 可能还有一些其他的注意事项,但是一般来说,我认为你会保持这种状态。


我立即想起的一件事是Mongoengine如何破解整个django认证系统。 Mongoengine <0.10有一个django兼容性应用程序,它实现了一个拐杖以将用户存储在MongoDB中,并通过self.request.user访问它们。

它必须使用拐杖,因为Django Session API是自定义的,并且假定您使用的是AUTH_USER_MODEL,由SQL数据库支持来存储您的用户。

因此,我认为您应该禁用SessionMiddleware和CSRF令牌处理,并为Admin和API目的使用2个不同的自定义身份验证系统。 使用TokenAuthentication或JWTAuthentication这应该是可行的。

下面是DRF和Mongoengine项目的另一个例子,由MongoDB支持的自定义TokenAuthentication实现。

链接地址: http://www.djcxy.com/p/33779.html

上一篇: User model other than AUTH

下一篇: Django DRF Token Authentication