为多租户环境指定身份验证后端

时间:2017-07-28 20:21:39

标签: python django

我理解Django通过循环设置settings.py DATABASES对象中的所有后端并尝试获取用户名和密码匹配来支持多租户。我想自定义authenticate方法,而不是遍历所有后端,以便我可以指定要进行身份验证的后端。

所以这个方法

def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backends(return_tuples=True):

看起来像这样。

def authenticate(request=None, **credentials):
    """
    If the given credentials are valid, return a User object.
    """
    for backend, backend_path in _get_backend('contoso'):

非常感谢任何提示或建议。

1 个答案:

答案 0 :(得分:1)

一个想法是将每个身份验证后端包装在一个包装器中,该包装器检查它是否是正确的。例如,您不是在AUTHENTICATION_BACKENDS设置中使用ModelBackend(请注意,而不是DATABASES),而是添加自己的类。

from django.contrib.auth.backends import ModelBackend

class StrictModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None):
        if desired_backend() == "path.to.StrictModelBackend":
            return super().authenticate(request, username=username, password=password)
        else:
            return None

为了简单起见,我在这里硬编码了包装器,但是如果你使用的不仅仅是几个后端,那么你可能会想要动态创建包装类。