【问题标题】:Django - Force a user to reset initial passwordDjango - 强制用户重置初始密码
【发布时间】:2019-04-07 02:31:35
【问题描述】:

我正在实现一个强制用户更改密码的功能(即,如果管理员创建了初始密码,则用户需要在下次登录时更改它)。我正在使用 Django Contrib Auth 包。

为此,我通过布尔参数 force_password_change 扩展了用户配置文件:

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  force_password_change = models.BooleanField(default=True)

在我看来,我正在扩展标准LoginView

class MyLoginView(LoginView):
  def form_valid(self, form):
      # form is valid (= correct password), now check if user requires to set own password
      if form.get_user().profile.force_password_change:
          return HttpResponseRedirect('password_change')
      else:
          auth_login(self.request, form.get_user())
          return HttpResponseRedirect(self.get_success_url())

点击login按钮后系统出现404 page not found错误:The current path, accounts/login/, didn't match any of these.

我注意到,当我在 HttpResponseRedirect('password_change') 之前添加 auth_login(self.request, form.get_user()) 时,它可以正常工作。但这也意味着用户(错误地)通过了身份验证。

urls.py:

path('', myapp.MyLoginView.as_view(), name='login'),
path('password_change/', myapp.MyPasswordChangeView.as_view(), name='password_change'),

为什么会出现这种情况,为什么 404 错误引用 accounts/login/

【问题讨论】:

  • 我面临着和你一样的问题。如果可能的话,您能否分享完整密码重置的代码?。
  • @DevKing 你好,你是怎么解决这个问题的?

标签: django django-views django-urls


【解决方案1】:

你需要使用reverse来解析url名称:

from django.urls import reverse

class MyLoginView(LoginView):
    def form_valid(self, form):
        # form is valid (= correct password), now check if user requires to set own password
        if form.get_user().profile.force_password_change:
            return HttpResponseRedirect(reverse('password_change'))
        else:
            auth_login(self.request, form.get_user())
            return HttpResponseRedirect(self.get_success_url())

【讨论】:

【解决方案2】:

使用User.set_unusable_password,然后假设您的密码更改视图称为“更改密码”:

将此添加到您的登录视图:

from django.http import HttpResponseRedirect
from django.urls import revese

if not user.has_usable_password():
    return HttpResponseRedirect(reverse('change-password')

【讨论】:

  • 不确定应该去哪里以及如何解决重定向问题?你能详细说明一下吗?
  • 用户如何使用已调用的 set_unusable_password() 登录?
猜你喜欢
  • 2020-02-15
  • 2020-02-06
  • 2020-10-30
  • 2012-09-23
  • 2012-09-27
  • 2023-02-01
  • 1970-01-01
  • 2020-05-21
  • 2013-03-12
相关资源
最近更新 更多