我理解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'):
非常感谢任何提示或建议。
答案 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
为了简单起见,我在这里硬编码了包装器,但是如果你使用的不仅仅是几个后端,那么你可能会想要动态创建包装类。