【问题标题】:how to access the request in a django custom authentication backend?如何在 django 自定义身份验证后端访问请求?
【发布时间】:2011-03-30 03:12:54
【问题描述】:

我想用 django 的身份验证做以下事情:

  • 记录错误的登录尝试
  • 在“x”次错误登录尝试后暂时锁定帐户
  • 记录成功的登录。

我认为自定义身份验证后端将是解决方案。

我可以做我想做的大部分事情,但我想记录尝试用户的 IP 和 REMOTE_HOST。

如何在认证后端访问请求对象?

谢谢

【问题讨论】:

    标签: django authentication


    【解决方案1】:

    身份验证后端可以为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 的登录视图(或管理员登录),则不会有额外的信息。简而言之,您必须使用自己的自定义登录视图。

    另外,在自动锁定帐户时要小心:您允许某人故意锁定您用户的一个帐户(拒绝服务)。有办法解决这个问题。此外,请确保您的错误尝试日志不包含任何尝试的密码。

    【讨论】:

    • 我正在扩展 ModelBackend - python 不允许我重载方法,对吗?什么是实现这一目标的好方法?只需重命名“身份验证”方法并在我看来调用它?
    • 我需要在登录视图中添加什么?只是复制整个当前的 contrib.auth 登录视图?我不明白,因为该方法从不调用“身份验证”...
    • 你当然可以在 python 中重载。 contrib.auth 要求后端有一个 authenticate 方法,所以你必须这样称呼它。
    • Django 的视图在验证 AuthenticationForm(在 contrib.auth.forms 中)时调用 authenticate()。 Django 的登录视图还支持许多您不需要的其他功能。将其放在您自己的视图中并不难,只需致电authenticate 并登录,如果一切都好。在表单验证中这样做当然更好,但您需要传递请求。
    • 这个 awnser 仍然需要我侵入管理员,因为身份验证是通过自定义表单调用的,该表单也没有请求属性..?
    【解决方案2】:

    在最近的 Django 版本中,authenticate() 接受“请求”作为第一个参数:

    • 自 Django 1.1 起可选
    • 自 Django 2.1 起需要

    见:

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 2018-02-24
      • 1970-01-01
      • 2020-11-17
      • 2015-07-31
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      相关资源
      最近更新 更多