【问题标题】:Django Multiple Auth ModelsDjango 多重身份验证模型
【发布时间】:2018-04-25 07:30:38
【问题描述】:

我正在做一个需要 3 种用户类型的项目。

  • 管理员
  • 供应商
  • 客户

我希望为所有三个供应商和客户拥有单独的模型,而不是在通用用户模型中拥有类型字段。

我解决这个问题的第一个方法是通过对 AbstractUser 模型进行子类化来定义所有模型

# models.py
from django.contrib.auth.models import AbstractUser

class Customer(AbstractUser):
    pass


class Vendor(AbstractUser):
    pass

并添加自定义的Authentication后端,根据请求对象处理用户的身份验证。

# settings.py

AUTHENTICATION_BACKENDS = ['backends.CustomAuthBackend']

我的 backends.py 文件将包含验证用户的逻辑,并根据请求对象为每个用户使用不同的模型。

# backends.py
from __future__ import print_function


class CustomAuthBackend(object):

    def authenticate(self, request, username=None, password=None):
       # authenticate user based on request object

    def get_user(self, user_id):
        # logic to get user

但这不起作用,看起来我还需要在 settings.py 中指定用于身份验证的 AUTH_USER_MODEL

有可能吗?Django 是否允许从 3 个不同的表进行身份验证。我该怎么做呢?有没有其他方法可以解决这个问题,我应该改变什么?

【问题讨论】:

    标签: python django django-models django-authentication


    【解决方案1】:

    django.contrib.auth 旨在与一个用户模型一起使用。根据您想要实现的目标,有不同的方法。

    如果您只想为不同类型的用户存储不同类型的配置文件/元数据,您可以使用 multi table inheritance - 在这种情况下,您可能会坚持使用默认用户模型。

    当涉及到基于用户类型的不同权限时,您不应该使用单独的类来解决这个问题。而是使用groups。这种方法更加灵活。几乎总是会发生一个人应该属于多个用户组的情况。当您根据用户类对此进行建模时,您就有麻烦了。

    【讨论】:

      【解决方案2】:

      几天前我做过类似的工作人员,您的方法是正确的。但是还有一些其他的事情需要改变才能使其发挥作用。我将解释我为使其成功所做的工作。

      首先,您必须自定义自己的用户模型,并且必须在进行迁移之前首先完成此操作。并且还在模型文件中定义了不同的 userManagers 来管理不同类型的用户。然后在您的设置文件中,您必须设置 AUTH_USER_MODEL 和 AUTHENTICATION_BACKENDS,AUTH_USER_MODEL 是 django 将用于身份验证的默认用户模型,您只能设置为一个用户模型,但对于 AUTHENTICATION_BACKENDS,您可以有多个后端,它是一个列表,django 将循环里面的每个选项进行身份验证。默认情况下它使用 django.contrib.auth.backends.ModelBackend,您可以添加自己的身份验证后端。查看如何制作自己的身份验证后端:https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#writing-an-authentication-backend。 并且取决于您的应用程序,您可能还需要自定义序列化程序函数并覆盖一些类以使其工作。在我自己的应用程序中,我使用 DRF 和 JWT 令牌进行身份验证,因此我还覆盖了一些默认使用 AUTH_USER_MODEL 变量的函数。最后,我可以使用管理模型登录管理页面并使用另一个自定义用户模型来验证应用程序并获取 JWT 令牌。无论如何,请始终参考此页面:https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#customizing-authentication-in-django。希望这对您的申请有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-09
        • 2013-11-15
        • 1970-01-01
        • 2021-06-20
        • 2013-11-03
        • 1970-01-01
        • 2012-10-06
        • 2019-03-23
        相关资源
        最近更新 更多