实现密码过期

实现密码过期。

本文档介绍如何实现密码过期功能。从 iTop 3.1.0 开始,此功能已内置在 Password Expiration Management 模块中。更多详细内容请参考 iTop 官方文档

概述

注意:从 iTop 3.1.0 开始,此功能已内置在 Password Expiration Management 模块中,无需再手动实现。

本教程描述如何强制现有用户更改密码以符合新添加的复杂性策略。管理员将所有用户的 expiration 标志设为 expired,用户登录时将被要求更改密码。

插入检查点

class MyClass extends AbstractLoginFSMExtension
{
    public function ListSupportedLoginModes() { return array('form'); }

    protected function OnUsersOK(&$iErrorCode)
    {
        /* 在此处添加特定代码 */
        return LoginWebPage::LOGIN_FSM_CONTINUE;
    }
}

检查密码是否过期

$oUser = UserRights::GetUserObject();
if ($oUser->Get('expiration') == 'expired')
{
   /* 添加更多代码 */
}

请求新密码

public function DisplayChangePwdForm($bFailedLogin = false, $sIssue = null)
{
    $oTwigContext = new LoginTwigRenderer();
    $aVars = $oTwigContext->GetDefaultVars();
    $aVars['bFailedLogin'] = $bFailedLogin;
    $aVars['sIssue'] = $sIssue;
    $oTwigContext->Render($this, 'changepwdform.html.twig', $aVars);
}

模板 iTop/templates/login/password/changepwdform.html.twig 可复用,需移除 old_pwd 部分。同时有 changepwdform.js.twig 控制两次输入是否相等以及密码是否符合策略。

保存新密码

$sNewPwd = utils::ReadPostedParam('new_pwd', '', 'raw_data');
$oUser->Set('password', $sNewPwd);
$oUser->Set('expiration', 'limited');
$oUser->DB_Update();

错误处理

try
{
    if (!UserRights::ChangePassword($sOldPwd, $sNewPwd))
    {
        $oPage = self::NewLoginWebPage();
        $oPage->DisplayChangePwdForm(true);
        $oPage->output();
        exit;
    }
}
catch (CoreCannotSaveObjectException $e)
{
    $oPage = self::NewLoginWebPage();
    $oPage->DisplayChangePwdForm(true, $e->getIssue());
    $oPage->output();
    exit;
}

注意事项

当扩展自动化过期行为时,应修改 UserLocal:password:expiration 的翻译,以反映此行为。


原文:https://www.itophub.io/wiki/page?id=3_2_0:customization:password-expiration

版本:3_2_0/customization/password-expiration.txt · Last modified: 2025/07/03 12:43 by 127.0.0.1