我正在为我的Django应用编写change password
功能,允许用户随意更改密码。一个要求是用户必须在继续更改之前重新提交原始密码。
负责reauth of original password
和enter new password
的视图会映射到两个单独的网址。目前它的设置方式,只需点击正确的网址即可直接进入功能的enter new password
部分。我需要强制reauth of original password
,因此当前的功能是不可接受的。
重新设计此功能的最佳策略是什么,以便重置密码在reauth要求后面?我想到的一件事是在成功的reauth时将标志设置为会话变量,并且只有在正确设置了所述标志的情况下才允许密码重置。但我希望能有更强大的方式吗?
我目前的代码是:
def reset_password(request,*args,**kwargs):
if request.method == 'POST':
form = ResetPasswordForm(data=request.POST,request=request)
if form.is_valid():
#save new password hash
else:
context={'form':form}
return render(request,'reset_password.html',context)
else:
form = ResetPasswordForm()
context={'form':form}
return render(request,'reset_password.html',context)
def reauth(request, *args, **kwargs):
if request.method == 'POST':
form = ReauthForm(data=request.POST,request=request)
if form.is_valid():
return redirect("reset_password")
else:
context={'form':form}
return render(request, 'reauth.html', context)
else:
form = ReauthForm()
context = {'form':form}
return render(request, 'reauth.html', context)
答案 0 :(得分:0)
我不知道这是否是最好的方法,我想强调我不知道这种方法有多安全,但这可以通过会话来完成。
这是一个例子,
@csrf_exempt
def render_first_page(request):
if request.method == 'POST':
request.session['first'] = True
print (request.session['first'])
return redirect('/second/')
try:
del request.session['first']
except KeyError:
pass
return HttpResponse("<form method='POST'><input type='text' name='test'/><input type='submit'/></form>")
def render_second_page(request):
try:
if request.session['first'] == True:
return HttpResponse("Welcome to Second Page")
except KeyError:
print ("No first")
return redirect('/first/')
要开始,如果第一个键是第一个&#39;在会话变量中不存在,并将重定向到第一页。
在我收到POST请求的第一页上,会话对象上创建了一个令牌,随后,我们被重定向到第二页,现在令牌存在,第二页被呈现。
请务必在适当的时候删除会话密钥。我建议在渲染第二页时删除令牌。