2012-01-08 60 views
3

我試圖尋找this answer,以及使用Django會議here自定義驗證後端中間件

用我的自定義身份驗證登錄工作正常,但我想驗證與中間件的每個請求上的令牌,我不知道如何存儲令牌,以便它可以從中間件訪問以及作爲意見。

我想從我的身份驗證後端存儲會話變量,但試圖從我的觀點訪問它時,我總是會得到一個關鍵的錯誤。

有沒有很好的方法來做到這一點?

謝謝!

class MyAuthBackend(object): 

    supports_inactive_user = False 
    supports_object_permissions = False 
    supports_anonymous_user = False 

    def authenticate(self, username=None, password=None): 
    # This makes a call to my API to varify login, then return token if valid. I need to make login_valid accessible to my middleware and views. 
     login_valid = auth.login(username,password) 
     if login_valid: 
      try: 
       user = User.objects.get(username=username) 
      except User.DoesNotExist: 
       user = User(username=username, password='never_used') 
       user.is_active = True 
       user.save() 
      return user 
     return None 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 





class MyAuthMiddleware(object): 
    def process_request(self, request): 
     if not request.user.is_anonymous(): 
    # API call to my backend to check if token is still valid. If not, return to login page. 
      token_variable = ??????????? 
      if isTokenStillValid(token_variable): 
       return 
      else: 
      return HttpResponseRedirect('/accounts/login/?next=%s' % request.path) 

回答

0

您是否使用默認的django.contrib.auth登錄視圖進行登錄?它似乎完全清除登錄過程中的會話(這發生在您的身份驗證後端被調用後,在contrib.auth.login函數中,描述爲here)。

我想你可能要麼嘗試寫自己的登錄視圖,它保留了身份驗證令牌替代登錄功能,或存放令牌別的地方(數據庫表,高速緩存系統)。後者可能會讓一個用戶難以同時登錄多個用戶。