Django REST Fram中AUTH_User_模型以外的用户模型

2024-04-25 00:58:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Django的管理用户由模型表示,这或多或少与默认的Django用户模型相同。管理员只能与Django管理员一起工作,不能使用drfapi。在

DRF的API用户只能通过DRF使用API,不能与Django管理或Django会话等进行交互

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

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连接。你们中有人做过类似的事情吗?在


Tags: django实例用户模型authapimodeladmin
3条回答

嗯,是的,先生。你能做到的。请看下面的example

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

在设置.py公司名称:

^{pr2}$

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

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

我马上想起的一件事是Mongoengine曾经如何入侵整个django身份验证系统。Mongoengine<;0.10有一个django compatibility app,它实现了一个拐杖,可以在MongoDB中存储用户,并通过self.request.user访问用户。在

它必须使用一个拐杖,因为Django会话API是自以为是的,并假设您使用AUTH_USER_模型,该模型由SQL数据库支持,用于存储用户。在

因此,我认为您应该禁用SessionMiddleware和CSRF令牌处理,并将2个不同的custom authentication systems用于管理和API目的。对于TokenAuthentication或JWTAuthentication,这应该是可行的。在

Here's another example of a project使用DRF和Mongoengine,使用custom implementation of TokenAuthentication,由MongoDB支持。在

由于您使用的是Django和DRF,也许您可以用您的定制编写一个从^{}扩展的APIUser模型,编写一个custom authentication class并将其插入到REST_FRAMEWORK.DEFAULT_AUTHENTICATION_CLASSES设置中。为django管理员保留AUTH_USER_模型。在

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

你的API视图应该使用rest框架的设置,你的Django管理员应该使用常规的Django设置。可能还有一些其他的注意事项,但一般来说,我想你还是可以接受的。在

相关问题 更多 >