2013-06-12 46 views
9

在这里需要认真的帮助。一个项目的Django多重身份验证后端,如何?

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

回答

24

可以有多个身份验证后端。只需在Django项目的settings.py中设置AUTHENTICATION_BACKENDS即可列出要使用的后端实现。比如我经常使用OpenID身份验证和标准的Django的认证,这样的组合,我settings.py

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'django_openid_auth.auth.OpenIDBackend', 
    ) 

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

请注意,您的自定义后端必须位于Django可见的路径中。在这个例子中,我必须将django_openid_auth添加到INSTALLED_APPS,否则Django将无法导入它并将其用作后端。

另请阅读相关文件,这是非常写得很好,很容易理解: https://docs.djangoproject.com/en/dev/topics/auth/customizing/

4

我经历过这个问题之前。这是我使用的代码。

这是在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 

的认证后端,这是我settings.py

AUTHENTICATION_BACKENDS = (
    'api.backend.EmailOrUsernameModelBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

希望它能帮助。请告诉我,如果你仍然有麻烦。此代码将使您能够使用电子邮件来验证默认的Django用户,即使在Django管理员中也是如此。

+0

尽管您的解决方案也很好,但它并不能完全解决我想要的问题,我会在几个小时内发布我的解决方案。顺便说一句,我从你的解决方案中得到了这个想法,所以这里给你一个+1。 –

+0

如果用户名可以包含“@”,则在用户名中使用'if'@'来标识用户名是否为电子邮件是一种非常糟糕的方式来实现它。您至少应该使用模式匹配或在源处识别所选的选项。 – vintagexav

+1

代替'如果用户名 '@':',用'django.core.validators.validate_email'这样的: '高清validateEmail(电子邮件): 尝试: validate_email(电子邮件) 返回true 除了ValidationError: 返回False' –

2

使用多个后端身份验证非常简单。你只需要了解Django应用程序的工作流程。

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.Backend1', 
    'django_openid_auth.auth.Backend2', 
    ) 

例如,您有以下两个后端定义。 Django将首先进入第一个后端,并且您只需要在后端放置一些逻辑,以便与后端无关时将其转发到其他后端或返回而不带任何结果。如果没有结果,django会自动将请求从第一个后端转移到第二个,如果第三个请求可用的话。 我花了很多时间,发现它并不那么复杂。

+0

我不明白你为什么发布的答案与我的几乎相同,发布2周前... :( – janos

+0

其实,好友我did'nt得到完全你想说什么,所以我跟着你回答,并做了我自己和volla的一些魔力,你的答案是好的,如果你加入我们的答案,并且将其放在最底部,这将是对这个问题的最好答案。祝你好运 –

+0

你可以给我留言,我会澄清;-)我现在澄清它,你怎么看?如果您仍然认为应该修改,请告诉我。 – janos