Django身份验证后端返回多个状态值

时间:2012-11-07 19:54:40

标签: django authentication login custom-backend

我正在编写自定义身份验证后端(以及自定义用户模型)以检查用户帐户是否已锁定或已过期。我看到在所有身份验证后端的示例中,返回值是User对象或None。并且生成的唯一例外是User.DoesNotExist。

我的问题是我应该如何返回不同的结果(例如帐户已锁定或已过期或已达到最大登录尝试次数)?

我应该提出自定义例外还是有其他方法可以做到这一点?

我正在使用Django 1.5alpha。

编辑: 我需要获取多个状态以向用户显示适当的消息并重定向到适当的视图。

2 个答案:

答案 0 :(得分:1)

正如文档中所述:

  

无论哪种方式,authenticate应检查它获取的凭据,如果凭据有效,它应返回与这些凭据匹配的User对象。如果它们无效,则应返回无。

已锁定,已过期或已达到最大登录尝试次数的帐户将被视为“无效”,因此应为这些条件返回None

基本上,只要登录被拒绝访问(无论出于何种原因),就应该返回None

答案 1 :(得分: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

然后在登录表单中,您可以捕获这些错误并将适当的验证错误传递给视图。