我有个建筑问题。我使用的是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
连接。你们中有人做过类似的事情吗?在
嗯,是的,先生。你能做到的。请看下面的example:
在设置.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设置。可能还有一些其他的注意事项,但一般来说,我想你还是可以接受的。在
相关问题 更多 >
编程相关推荐