jboss 在Keycloak中的更新用户配置文件中添加自定义验证

yv5phkfx  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(207)

我在login-update-profile.ftl中添加了一个名为organization的自定义属性,它能够将用户的输入保存到Keycloak中。

<div class="${properties.kcFormGroupClass!}">
    <div class="${properties.kcLabelWrapperClass!}">
        <label for="user.attributes.organization" class="${properties.kcLabelClass!}">${msg("organization")}</label>
    </div>
    <div class="${properties.kcInputWrapperClass!}">
        <div class="${properties.kcInputWrapperClass!}">
            <input type="text" id="user.attributes.organization" name="user.attributes.organization" value="${(user.attributes.organization!'')}" class="${properties.kcInputClass!}" aria-invalid="<#if messagesPerField.existsError('organization')>true</#if>"
            />
        </div>

        <#if messagesPerField.existsError('organization')>
            <span id="input-error-organization" class="${properties.kcInputErrorMessageClass!}" aria-live="polite">
                ${kcSanitize(messagesPerField.get('organization'))?no_esc}
            </span>
        </#if>
    </div>
</div>

如何为这个字段添加验证?我需要使它成为一个必填字段,并满足一定的条件(例如字符串的长度)。如果输入无效,错误消息预计会显示(就像我们在电子邮件或用户名字段中看到的)

v440hwme

v440hwme1#

我通过在First Broker Login流中创建服务提供者Review Profile的自定义实现找到了解决方案。

public List<FormMessage> getCustomAttributeError(String organization) {
        List<FormMessage> errors = new ArrayList<>();

        // You can add more conditions & parameters to be validated
        if(Validation.isBlank(organization)){
            errors.add(new FormMessage("organization", "missingOrganizationMessage"));
        }

        return errors;
    }
  • 转到actionImpl函数,并在profile.update((attributeName, userModel)catch (ValidationException pve)之间添加以下行:
if(getCustomAttributeError(profile.getAttributes().getFirstValue("organization")).size() > 0){
        throw new ValidationException();                
    }
  • List<FormMessage> errors后面的catch (ValidationException pve)中添加以下行:
List<FormMessage> extraErrors = getCustomAttributeErrors(profile.getAttributes().getFirstValue("organization"));
    for(FormMessage error : extraErrors) {
        errors.add(error);
    }
  • 打开IdpReviewProfileAuthenticatorFactory.java,转到getDisplayType()函数,并将返回值更改为"Custom Review Profile"
  • 构建.jar,将其部署到keycloak中,创建First Broker Login流的副本,我们将其命名为Custom First Broker Login,并在Custom First Broker Login中将Review Profile替换为Custom Review Profile
  • 通过单击Custom Review Profile的操作按钮对其进行配置,为其给予别名,然后将Update Profile on First Login转换为on
  • 将所需的身份提供者与新的Custom First Broker Login绑定

相关问题