首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在第一次登录时强制更改密码(Django)

在第一次登录时强制更改密码(Django)
EN

Stack Overflow用户
提问于 2019-07-02 14:48:45
回答 1查看 4.1K关注 0票数 0

客户端要求管理人员能够将用户添加到公司(随机一次密码),在该公司中,用户必须在访问任何内容之前更改密码。我正在Django 2.2中开发应用程序

我创建了一个自定义用户,用电子邮件地址替换用户名,并向用户添加了一个change_password bool标志。我的change_password表单/函数工作正常,但重定向不起作用。

urls.py

代码语言:javascript
复制
path('change-password/', views.change_password, name='change-password'),

views.py

代码语言:javascript
复制
class Login(LoginView):
    def form_valid(self, form):
        # form is valid (= correct password), now check if user requires to set own password
        if form.get_user().change_password:
            return HttpResponseRedirect(reverse('change-password'))
        else:
            auth_login(self.request, form.get_user())
            return HttpResponseRedirect(self.get_success_url())


def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            request.user.change_password = False
            request.user.save()
            update_session_auth_hash(request, request.user)
            return redirect(reverse('user_view'))
        else:
            return redirect(reverse('change-password'))
    else:
        form = PasswordChangeForm(user=request.user)

        args = {'form': form}
        return render(request, 'users/change_password.html', args)

但是,如果change_password标志为True,则预期的行为是重定向到更改密码,而应用程序则重定向到更改密码,提交后将引发以下错误:

NotImplementedError: Django没有为AnonymousUser提供DB表示。

如果我将装饰器@login_required添加到我的change_password函数中,那么这个错误就会消失,但是,我会被重定向回登录页面,其中URL是:user/ login /next=/change_password/change_password/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-02 16:37:27

问题是,在form_valid方法中,您正在调用form.get_user(),该方法对用户进行身份验证/获取并正确检查change_password,但它没有登录用户,这意味着发出请求的用户对系统仍然是匿名的。因此,当用户被重定向时,没有对它们进行身份验证,这意味着request.user对象的类型是AnonymousUser,它不存在于数据库中,因此Django没有为AnonymousUser错误提供DB表示。

当您使用@login_required装饰器时,用户会被重定向到登录页面,因为它不是登录用户,而且装饰器要求用户登录查看它正在装饰的视图。

您看到的users/login/?next=/users/change-password/基本上是login_required装饰器的工作方式,它正在做两件事: 1.将匿名用户重定向到登录页面( URL的users/login部分) 2.一旦他们成功登录,就可以从他们的来源(?next=/users/change-password/)重定向他们。

我的建议是,将试图登录但必须更改其密码的用户的用户名传递给change_password视图,并有一个表单等待那里的用户请求当前密码、新密码和新密码的确认。这是做你想做的事情的最简单的方法,但是你必须确认用户当前的密码是正确的。

很抱歉,第一个答案让人困惑,我第一次没读到这个问题,希望这更有意义:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56855044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档