如何在Keycloak中通过新密码字段同步更新确认密码字段值?
解决Keycloak密码更新页面隐藏确认密码并同步值的问题
要实现只展示新密码字段,同时让隐藏的确认密码字段自动同步新密码的值,按以下步骤修改login-update-password.ftl:
1. 隐藏确认密码的表单区域
找到包含password-confirm的整个表单组div,给它加上style="display:none;",这样整个确认密码的输入区域就不会在页面上显示。
2. 添加同步密码的JavaScript
在表单结束前(</form>标签之前)添加一段JS,监听新密码输入框的输入事件,实时把值同步到隐藏的确认密码输入框里。
修改后的完整代码
<#import "template.ftl" as layout> <@layout.registrationLayout displayMessage=!messagesPerField.existsError('password','password-confirm'); section> <#if section = "header"> ${msg("updatePasswordTitle")} <#elseif section = "form"> <form id="kc-passwd-update-form" class="${properties.kcFormClass!}" action="${url.loginAction}" method="post"> <input type="text" id="username" name="username" value="${username}" autocomplete="username" readonly="readonly" style="display:none;"/> <input type="password" id="password" name="password" autocomplete="current-password" style="display:none;"/> <div class="${properties.kcFormGroupClass!}"> <div class="${properties.kcLabelWrapperClass!}"> <label for="password-new" class="${properties.kcLabelClass!}">${msg("passwordNew")}</label> </div> <div class="${properties.kcInputWrapperClass!}"> <input type="password" id="password-new" name="password-new" class="${properties.kcInputClass!}" autofocus autocomplete="new-password" aria-invalid="<#if messagesPerField.existsError('password','password-confirm')>true</#if>" /> <#if messagesPerField.existsError('password')> <span id="input-error-password" class="${properties.kcInputErrorMessageClass!}" aria-live="polite"> ${kcSanitize(messagesPerField.get('password'))?no_esc} </span> </#if> </div> </div> <!-- 隐藏确认密码的表单组 --> <div class="${properties.kcFormGroupClass!}" style="display:none;"> <div class="${properties.kcLabelWrapperClass!}"> <label for="password-confirm" class="${properties.kcLabelClass!}">${msg("passwordConfirm")}</label> </div> <div class="${properties.kcInputWrapperClass!}"> <input type="password" id="password-confirm" name="password-confirm" class="${properties.kcInputClass!}" autocomplete="new-password" aria-invalid="<#if messagesPerField.existsError('password-confirm')>true</#if>" /> <#if messagesPerField.existsError('password-confirm')> <span id="input-error-password-confirm" class="${properties.kcInputErrorMessageClass!}" aria-live="polite"> ${kcSanitize(messagesPerField.get('password-confirm'))?no_esc} </span> </#if> </div> </div> <div class="${properties.kcFormGroupClass!}"> <div id="kc-form-options" class="${properties.kcFormOptionsClass!}"> <div class="${properties.kcFormOptionsWrapperClass!}"> <#if isAppInitiatedAction??> <div class="checkbox"> <label><input type="checkbox" id="logout-sessions" name="logout-sessions" value="on" checked> ${msg("logoutOtherSessions")}</label> </div> </#if> </div> </div> <div id="kc-form-buttons" class="${properties.kcFormButtonsClass!}"> <#if isAppInitiatedAction??> <input class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonLargeClass!}" type="submit" value="${msg("doSubmit")}" /> <button class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonLargeClass!}" type="submit" name="cancel-aia" value="true" />${msg("doCancel")}</button> <#else> <input class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}" type="submit" value="${msg("doSubmit")}" /> </#if> </div> </div> <!-- 添加同步密码的JS --> <script> const newPasswordInput = document.getElementById('password-new'); const confirmPasswordInput = document.getElementById('password-confirm'); // 实时同步输入值 newPasswordInput.addEventListener('input', function() { confirmPasswordInput.value = this.value; }); // 页面加载时如果有默认值也同步(可选) if (newPasswordInput.value) { confirmPasswordInput.value = newPasswordInput.value; } </script> </form> </#if> </@layout.registrationLayout>
关键说明
- 隐藏确认密码区域:通过给外层div加
display:none,既保留了表单需要的password-confirm参数,又不会在页面上显示该字段。 - 同步逻辑:通过监听新密码输入框的
input事件,每次输入都把值同步到确认密码框,确保提交表单时两个字段值一致,满足后端API的参数要求。
内容的提问来源于stack exchange,提问作者jedda ler
相关产品推荐
相关产品推荐

