一个项目的Django多重身份验证后端,怎么样?

Rai*_*ham 14 python authentication django backend

需要认真的帮助.

我有一个用django/python编写的应用程序,我必须扩展它并在此应用程序中包含一些其他解决方案作为"app".例如,我要集成的应用程序名为"my_new_app"现在有一个为主应用程序编写的后端身份验证,我无法使用它.我有一个mysql数据库来查询,主应用程序主要使用cassendra和redis.所以我的问题是,有没有什么办法可以为新的应用程序"my_new_app"使用单独的身份验证后端,并在同一个域中运行它们?问题可能不是那么清楚,如果被问到我会澄清.

Sto*_*ica 36

可以拥有多个身份验证后端.只需设置AUTHENTICATION_BACKENDSsettings.py你的Django项目列出您要使用的后端实现.例如,我经常使用OpenID身份验证和标准Django身份验证的组合,如下所示settings.py:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'django_openid_auth.auth.OpenIDBackend',
    )
Run Code Online (Sandbox Code Playgroud)

在这个例子中,Django将首先尝试使用身份验证django.contrib.auth.backends.ModelBackend,这是Django的默认后端.如果失败,那么它会移动到下一个后端,django_openid_auth.auth.OpenIDBackend.

请注意,您的自定义后端必须位于Django可见的路径中.在这个例子中,我要补充django_openid_authINSTALLED_APPS,否则Django将无法进口并使用它作为后端.

另请阅读相关文档,它编写得非常好,易于理解:https: //docs.djangoproject.com/en/dev/topics/auth/customizing/


Edw*_*ndo 7

我以前经历过这个问题.这是我使用的代码.

这是api/backend.py的身份验证后端

from django.contrib.auth.models import User


class EmailOrUsernameModelBackend(object):

    def authenticate(self, username=None, password=None):
        if '@' in username:
            kwargs = {'email': username}
        else:
             kwargs = {'username': username}
        try:
            user = User.objects.get(**kwargs)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None
Run Code Online (Sandbox Code Playgroud)

这是我的settings.py

AUTHENTICATION_BACKENDS = (
    'api.backend.EmailOrUsernameModelBackend',
    'django.contrib.auth.backends.ModelBackend',
)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.如果你还有问题,请告诉我.此代码将使您能够使用电子邮件来验证默认的Django用户,即使在Django管理员中也是如此.

  • 取而代之的是`if '@' in username:`,像这样使用`django.core.validators.validate_email`:`def validateEmail(email): try: validate_email(email) return True except ValidationError: return False` (2认同)