2012-11-07 84 views
0

我正在編寫自定義身份驗證後端(和自定義用戶模型)以檢查用戶帳戶是否被鎖定或過期。我發現在所有身份驗證後端返回值的示例中,都是User對象或None。唯一的例外是User.DoesNotExist。Django身份驗證後端返回多個狀態值

我的問題是我應該如何去返回不同的結果(例如帳戶被鎖定或過期或最大登錄次數達到)?

我應該提出自定義異常還是有另一種方法來做到這一點?

我正在使用Django 1.5alpha。

編輯: 我需要獲取多個狀態才能向用戶顯示適當的消息並重定向到適當的視圖。

回答

1

我最終這樣做是爲了防止任何人有同樣的問題。

class UserNotActivatedError(Exception): 
    pass 

class UserLockedError(Exception): 
    def __init__(self, remaining_mins): 
     self.remaining_mins = remaining_mins 

# backend 
def authenticate(self, email=None, password=None): 
    if email is None or password is None: 
     return None 
    try: 
     user = ExtUser.objects.get(email=email) 
     user.last_login_attempt_at = timezone.now() 
     if not use.is_active: 
      raise UserNotActivatedError 
     if user.is_locked: 
      # Check when it was locked and found the duration 
      sec_to_go = user.get_remaining_locktime() 
      if sec_to_go: 
       raise UserLockedError(sec_to_go) 
     if user.check_password(password): 
      user.last_login_at = timezone.now() 
      return user 
     else: 
      return None 
    except User.DoesNotExist: 
     return None 

然後在登錄表單中,您可以捕獲這些錯誤並將適當的驗證錯誤傳遞給視圖。

1

如文檔指出:

無論哪種方式,驗證應檢查它獲得的憑據,它應該返回匹配這些憑據,憑據是否有效的用戶對象。如果它們無效,則應返回無。

被鎖定的賬戶,過期或已達到登錄嘗試的最大的數量將被視爲「無效」,所以None應該爲那些條件被退回。

基本上,None應該返回,只要登錄應該被拒絕訪問(無論什麼原因)。

+0

謝謝。這有助於瞭解。但我仍然需要來自Authenticate方法的多個狀態來顯示適當的消息和視圖。我用這個信息編輯了我的問題。 – maulik13