2012-11-07 117 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