【发布时间】:2011-03-30 03:12:54
【问题描述】:
我想用 django 的身份验证做以下事情:
- 记录错误的登录尝试
- 在“x”次错误登录尝试后暂时锁定帐户
- 记录成功的登录。
我认为自定义身份验证后端将是解决方案。
我可以做我想做的大部分事情,但我想记录尝试用户的 IP 和 REMOTE_HOST。
如何在认证后端访问请求对象?
谢谢
【问题讨论】:
标签: django authentication
我想用 django 的身份验证做以下事情:
我认为自定义身份验证后端将是解决方案。
我可以做我想做的大部分事情,但我想记录尝试用户的 IP 和 REMOTE_HOST。
如何在认证后端访问请求对象?
谢谢
【问题讨论】:
标签: django authentication
身份验证后端可以为authenticate() 方法采用任意数量的自定义参数。例如:
class MyBackend:
def authenticate(self, username=None, password=None, request=None):
# check username, password
if request is not None:
# log values from request object
如果你在自己的视图中调用authenticate,你可以传递请求对象:
from django.contrib.auth import authenticate
def login(request):
# discover username and password
authenticate(username=username, password=password, request=request)
# continue as normal
如果您使用 django 的登录视图(或管理员登录),则不会有额外的信息。简而言之,您必须使用自己的自定义登录视图。
另外,在自动锁定帐户时要小心:您允许某人故意锁定您用户的一个帐户(拒绝服务)。有办法解决这个问题。此外,请确保您的错误尝试日志不包含任何尝试的密码。
【讨论】:
contrib.auth 要求后端有一个 authenticate 方法,所以你必须这样称呼它。
AuthenticationForm(在 contrib.auth.forms 中)时调用 authenticate()。 Django 的登录视图还支持许多您不需要的其他功能。将其放在您自己的视图中并不难,只需致电authenticate 并登录,如果一切都好。在表单验证中这样做当然更好,但您需要传递请求。
在最近的 Django 版本中,authenticate() 接受“请求”作为第一个参数:
见:
【讨论】: