【问题标题】:Overriding authenticate method - Django admin覆盖身份验证方法 - Django admin
【发布时间】:2011-05-10 23:44:52
【问题描述】:

我正在尝试弄清楚如何使用附加功能来增强身份验证方法。

例如

  • 密码过期
  • 特殊密码格式
  • 长度要求
  • 等等……

网站的前端非常简单,但管理面板呢?


我认为我应该覆盖用户的管理器对象,因为身份验证可能驻留在那里。我认为这很难弄清楚。

提前致谢! :)

【问题讨论】:

    标签: python django django-models django-admin django-authentication


    【解决方案1】:

    您可以按照http://docs.djangoproject.com/en/dev/topics/auth/#authentication-backends 中的说明创建自定义身份验证后端。本质上,您创建了一个具有authenticate 方法的后端类:

    class MyBackend:
        def authenticate(self, username=None, password=None):
            # Check the username/password and return a User.
    

    然后在settings.py中添加类到AUTHENTICATION_BACKENDS

    虽然这是用于身份验证,但您可以执行您提到的所有密码验证操作,例如,如果密码正确但已过期,只需将用户重定向到更改密码页面即可。考虑使用messaging framework 向用户提示在将他引导至通用更改密码页面时发生了什么。

    【讨论】:

    • 您好,您几乎涵盖了所有内容:O 这是一个很好的回复!非常感谢。
    • 您好,我正在实现身份验证后端,我对信号有点困惑。我无法在管理员中实施正确的验证?
    • @RadiantHex 我为 django 信号部分道歉。它不适用于您的情况,因为您无法从模型中读取原始密码(它已经被散列),因此您无法进行验证。乔丹关于将密码页面劫持到自定义视图的建议更好。您只需要劫持所有可以更改密码的页面。另一种方法是尝试User模型的set_password方法的monkey-patching
    【解决方案2】:

    如果您希望将密码验证内置到模型中,那么您可能需要extend the django User model

    否则,您可以执行以下操作:

    • 通过创建您自己的用于更改和设置密码的视图来覆盖管理员密码选项,然后将相关 URL 放在 (r'^admin/', include(admin.site.urls)) 上方。正则表达式看起来像(r'^admin/auth/user/(\d+)/password/', new_change_password)
    • 在单独的模型中跟踪密码使用期限,然后在过期时重定向到更改密码。

    【讨论】:

    • 嗨,我发现这个回复实际上更有用,你知道如何将视图转发到密码更改视图吗?
    • 您的意思是重定向吗?您可以使用HttpResponseRedirect 将用户重定向到更改密码页面的url。我认为如果您查看 django/contrib/auth 的 urls 文件,那么您可以找到要使用的 url 名称。
    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 2019-05-22
    • 1970-01-01
    • 2017-12-07
    • 2012-10-31
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多