【问题标题】:Add custom validation in Update User Profile in Keycloak在 Keycloak 的更新用户配置文件中添加自定义验证
【发布时间】:2021-10-09 17:36:06
【问题描述】:

我在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>

如何为该字段添加验证?我需要将其设为必填字段并满足某些条件(例如字符串的长度)。如果输入无效,则应显示错误消息(如我们在电子邮件或用户名字段中看到的)

【问题讨论】:

    标签: jboss single-sign-on wildfly keycloak freemarker


    【解决方案1】:

    我通过在First Broker Login 流中创建Review Profile 的自定义SPI 找到了解决方案。步骤如下:

        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();                
        }
    
    • catch (ValidationException pve)List&lt;FormMessage&gt; errors 之后添加此行:
        List<FormMessage> extraErrors = getCustomAttributeErrors(profile.getAttributes().getFirstValue("organization"));
        for(FormMessage error : extraErrors) {
            errors.add(error);
        }
    
    • 打开IdpReviewProfileAuthenticatorFactory.javagetDisplayType()函数,把返回值改成"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 绑定所需的身份提供程序

    【讨论】:

    • 是否可以使您的代码适应Registration 工作流程?
    • @FredericoSchardong 这是不可能的,因为它是从不同的 SPI 派生的,但您可以调整程序。也许从自定义 default registration form 开始
    • 谢谢。我最终使用了实验性的user profile
    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 2019-11-03
    • 2021-10-21
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多