我正在编写自定义身份验证后端(和自定义用户模型),以检查用户帐户是否已锁定或过期。我看到在身份验证后端返回值的所有示例中都是用户对象或无。生成的唯一例外是用户。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
然后,在登录表单中,您可以捕获这些错误并将适当的验证错误传递给视图。