0

我在Python 3上使用Django 1.8.4,並嘗試創建一個auth後端,它驗證來自傳統ColdFusion網站的cookie並在檢查數據庫中的值後創建/登錄Django用戶。在設置中,我包括後端:Django自定義驗證後端似乎沒有被調用?

AUTHENTICATION_BACKENDS = (
    'site_classroom.cf_auth_backend.ColdFusionBackend', 
) 

而後端本身的代碼; SiteCFUser是對其中包含的活動cookie標記值的SQL Server數據庫用戶模型的模型:

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth import get_user_model 
from users.models import SiteCFUser 


class ColdFusionBackend(ModelBackend): 
    """ 
    Authenticates and logs in a Django user if they have a valid ColdFusion created cookie. 

    ColdFusion sets a cookie called "site_web_auth" 
    Example cookie: [email protected]+username+domain+8E375588B1AAA9A13BE03E401A02BC46 
    We verify this cookie in the MS SQL database 'site', table site_users, column user_last_cookie_token 
    """ 

    def authenticate(self, request): 
     User = get_user_model() 

     print('Hello!') 
     token=request.COOKIES.get('site_web_auth', None) 
     print('Token: ' + token) 
     cookie_bites = token.split('+') 

     if cookie_bites[0] != "[email protected]": 
      # Reality check: not a valid site auth cookie 
      return None 

     username = cookie_bites[1] 
     cf_token = cookie_bites[3] 

     try: 
      site_user = SiteCFUser.objects.using('mssqlsite').filter(cf_username=username) 
     except: 
      # No user found; redirect to login page 
      return None 

     if site_user[0].cftoken == cf_token: 
      try: 
       # Does the user exist in Django? 
       user = User.objects.get(username=username) 
      except: 
       # User does not exist, has a valid cookie, create the User. 
       user = User(username=username) 
       user.first_name = site_user[0].cf_first_name 
       user.last_name = site_user[0].cf_last_name 
       user.email = site_user[0].cf_email 
       user.save() 
     else: 
      return None 

    def get_user(self, user_id): 
     User = get_user_model() 

     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

的問題是,後端似乎不打一個有風景的URL與@login_required時調用,或甚至嘗試通過使用用戶名和密碼的表單登錄。如果我通過在設置中更改類的名稱來強制出現錯誤,或者在cf_auth_backend.py中更改類的名稱,則會出現錯誤。但是,控制檯中沒有顯示任何打印語句。我很明顯在這裏錯過了一些東西:任何想法我沒有做對嗎?

+0

如果用戶尚未通過身份驗證,則所有'@ login_required'都會重定向到登錄頁面。您需要顯示該視圖的代碼。 –

回答

1

身份驗證後端不能這樣工作。他們不會在每個請求或需要身份驗證的請求上被調用。

如果您想基於某個cookie登錄用戶,則應該在中間件中調用身份驗證。

2

雖然接受的答案可能對OP有所幫助,但它不是問題標題的一般答案。

認證後端只需將它們列在AUTHENTICATION_BACKENDS中即可。但是,他們可能會被忽略 由於種種原因,例如:

  • urls.py需要指向像django.contrib.auth.views.login

    url(r'^accounts/login/$', django.contrib.auth.views.login) 
    

    如果它指向一些其他身份驗證的應用程序。 AUTHENTICATION_BACKENDS 可能無法正常工作。

  • authenticate()方法必須接受password關鍵字,或者通過 password=None**kwargs。也許username也是如此。如果它不接受該關鍵字參數,將不會調用 。