覆盖Django管理后台的身份验证方法

6
我正在尝试找出如何增强验证方法以实现额外的功能,例如:
- 密码到期 - 特殊密码格式 - 长度要求 - 等等...
对于网站前端而言,这是相当直接的。但是管理员面板呢?
我认为应该重写用户管理对象,因为验证可能驻留在那里。我认为这很难解决。
谢谢! :)
2个回答

6

您可以按照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中添加该类。虽然这是用于身份验证的,但如果需要,您可以通过将用户重定向到更改密码页面来执行所有密码验证操作,例如,如果密码正确但已过期。考虑使用消息框架,在将用户引导到通用更改密码页面时,向用户提供有关正在发生的事情的提示。

嗨,你几乎覆盖了所有的内容 :O 这是一个非常好的回复!非常感谢你。 - RadiantHex
嗨,我正在实现身份验证后端,我有点困惑信号。我是否无法在管理员中实现适当的验证? - RadiantHex
@RadiantHex 对于 Django 信号部分我道歉了。在您的情况下,它不适用,因为您无法从模型中读取原始密码(它已经被哈希处理),因此您无法进行验证。Jordan 建议的劫持密码页面到自定义视图更好。您只需要劫持所有可以更改密码的页面即可。另一种方法是尝试对 User 模型的 set_password 方法进行 monkey-patching - eddie_c

0

如果您希望密码验证内置于模型中,则可能需要扩展django用户模型

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

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

嗨,实际上我发现这个回复更有用,你知道如何将视图转发到密码更改视图吗? - RadiantHex
你是指重定向吗?你可以使用HttpResponseRedirect将用户重定向到更改密码页面的URL。我认为,如果你查看django/contrib/auth的urls文件,你就可以找到要使用的URL名称。 - Jordan Reiter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接