2013-06-12 65 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