如果HR添加了first_name, last_name, email, username和password的用户。设置密码后,密码只能访问5分钟,超过5分钟,密码将无法登录。
有人知道如何在django中解决这个问题吗
这是我的代码
models.py
class RegisterUser(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
mobile = models.CharField(max_length=100)
password_expiry = models.DateTimeField(null=True, blank=True)
settings.py
PASSWORD_RESET_TIMEOUT_MINUTES = 5
views.py
from Password_Expiry.settings import PASSWORD_RESET_TIMEOUT_MINUTES
def register(request):
if request.method == 'POST':
fname = request.POST['fname']
lname = request.POST['lname']
mobile = request.POST['mobile']
email = request.POST['email']
uname = request.POST['uname']
pwd = request.POST['pwd']
user = User.objects.create(first_name=fname, last_name=lname, email=email, username=uname)
user.set_password(pwd)
user.save()
reg_user = RegisterUser(user=user, mobile=mobile)
reg_user.password_expiry = datetime.datetime.now() + timedelta(minutes=PASSWORD_RESET_TIMEOUT_MINUTES)
reg_user.save()
return redirect('/')
return render(request, 'register.html')
def login(request):
if request.method == 'POST':
uname = request.POST['uname']
pwd = request.POST['pwd']
user = authenticate(username=uname, password=pwd)
if user is not None:
if user.is_active:
auth.login(request, user)
return redirect('home')
else:
messages.error(request, 'this account is disabled. please contact admin.')
return redirect('login')
else:
messages.error(request, 'invalid username or password')
return redirect('login')
else:
return render(request, 'login.html',{'message':messages})
在您的登录视图函数中,您可以验证当前时间小于模型中的password_expiry属性。如果小于5分钟,登录用户,否则你可以使用PasswordResetView和Django的邮件后端发送密码重置邮件给用户。查看文档了解更多细节:https://docs.djangoproject.com/en/4.2/topics/auth/default/
一旦用户重置密码,您需要记住在模型中更新/扩展password_expiry属性,这样他们就不会被阻止登录。
是否RegisterUser模型仅用于存储用户的手机号码和密码过期时间?如果是这样,为什么不直接用所需的字段扩展User模型呢?此外,在寄存器函数中有两个返回语句,这意味着永远不会调用第二个语句。
我还建议在forms.py中创建适当的Login/Register表单,并在视图函数中使用它们。然后,您将能够调用.is_valid()
方法来验证表单中的数据。
由于注册表单映射到你的User
模型,你可以使用django的ModelForm
,然后使用.save()
来创建和保存数据库对象,而不是在视图函数中手动创建对象。https://docs.djangoproject.com/en/4.1/topics/forms/modelforms/
// forms.py
class SignUpForm(ModelForm):
class Meta:
model = User
…
// views.py
def register(request):
if request.method == ‘POST’:
form = SignUpForm(request.POST)
...
if form.is_valid():
# data valid
...
form.save() # User is saved to database