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



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

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

我应该提出自定义例外吗?

有另一种方法?

我正在使用django 1.5alpha。

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

如文档中所述:

无论哪种方式,身份验证都应检查获得的凭据,如果凭据有效,它应该返回与这些凭据相匹配的用户对象。如果它们不有效,则不得返回。

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

基本上,每当应拒绝登录时返回None(无论出于何种原因)。

我最终这样做,以防任何人都有相同的问题。

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

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

最新更新