強制要求Django的用戶必須修改密碼,如果他們在一定期間內沒有更改密碼的話
环境
Windows 11 家庭版
Python 3.10.2
Django 4.0.2
支持venv
(PyPI)
APScheduler版本为 3.8.1
※确保已完成相关文章的第1回和第2回
相关文章
Django 第1節:创建Django自定义用户模型
Django 第2節:在Django初次登录时强制修改密码
Django 第3節:对于一段时间内未更改密码的用户强制进行密码修改
Django 第4節:生成随机且带有效期限的URL,经上级批准后发行账户
Django 第5節:通过锁定密码尝试次数和使用随机且带有效期限的URL进行本人身份确认解锁
背景 – 背景情况
有时候,我们可能需要在一定的时间周期内,例如90天后,促使用户更改密码。无论在安全方面是否有意义,我们都会实施这一功能。
在前几篇文章中,我们创建了自定义用户模型,并准备了password_changed和password_changed_date作为参数。
然后,在上一篇文章中,我们利用这些参数,在用户首次登录时强制要求更改密码。
现在,在本文中,我们将利用这些值,定期地强制用户更改密码。
安装软件包
高级Python调度器(APScheduler)是一个能够以一次性或定期方式对Python代码进行调度的Python库。
可以使用pip命令进行安装。
使用pip install APScheduler。
第一步

以下内容,请作如下叙述。
import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from .models import User # 作成したCustom User Model
def longTimeNoChangePassword():
"""一定期間パスワード変更をしていないユーザに次回アクセス時パスワード変更を強制させる"""
# 期間をここでは3か月=93日とする
today = datetime.date.today()
xday1 = datetime.timedelta(days = 93)
xdaybefore1 = today - xday1
xday2 = datetime.timedelta(days = 92)
xdaybefore2 = today - xday2
# 対象ユーザを検索(フィルター)し、対象ユーザのステータスを更新する
queryset = User.objects.filter(password_changed_date__range = [xdaybefore1, xdaybefore2], password_changed = True)
for query in queryset:
query.password_changed = False
query.save()
def start():
"""指定スケジュールで実行"""
scheduler = BackgroundScheduler()
scheduler.add_job(longTimeNoChangePassword, trigger='cron', hour='22', minute='00', misfire_grace_time=60*60)
scheduler.start()
这是解释的第一种方法。
objects.filter(password_changed_date__range = [xdaybefore1, xdaybefore2]では
パラメータpassword_changed_dateを範囲で検索するために__range = [xdaybefore1, xdaybefore2]という表記を利用している。
__range(アンダーバー2個)でレンジ扱いとなる。
今回password_changed_dateを日時側としてしまったため、yyyy/mm/ddではヒットせず、yyyy/mm/dd~yyyy/mm/dd-1の日付の範囲でヒットさせることにした。
cronでの時刻指定の詳細は備考1の公式を参照のこと。
misfire_grace_timeはジョブの起動ずれをどこまで許容するか。単位は秒。
第二步
更新 users 文件夹下的 apps.py。
from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'users'
# 追加
def ready(self):
"""起動時に呼び出される"""
from .update import start
start()
Option 1:
第二解释
调用了刚才的update.py的start函数。
确认
当您在93天前创建一个合适的帐户并进行确认时,可以看到password_changed被更新为False。
此外,根据上次的设置,该帐户在下一次登录时将强制转移到密码更改页面。
请你提供一个具体的句子,以便我能够为您进行中文转述。
apscheduler.triggers.cron: apscheduler 调度器的 cron 触发器
当使用 add_job 方法时,必须指定 misfire_grace_time 参数
Django 第1回:创建 Django 自定义用户模型
Django 第2回:在初次登录时强制进行密码更改
Django 第3回:强制对一段时间没有更改密码的用户进行密码更改
Django 第4回:生成随机且带有效期的 URL,由上级用户批准后发行账号
Django 第5回:使用密码尝试次数锁定和基于随机有效期 URL 的本人验证来解除账号解锁