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

Posted

技术标签:

【中文标题】在 Keycloak 的更新用户配置文件中添加自定义验证【英文标题】:Add custom validation in Update User Profile in 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>

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

【问题讨论】:

【参考方案1】:

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

确保您的 keycloak 版本是最新的稳定版本 打开keycloak的github repo,找到Review Profile的相关Java代码。在撰写此答案时(keycloak v15.0.2),我们需要 3 个文件:AbstractIdpAuthenticator.java、IdpReviewProfileAuthenticatorFactory.java 和 IdpReviewProfileAuthenticator.java 确保您能够使用这些文件构建.jar SPI 打开IdpReviewProfileAuthenticator.java并添加此功能:
    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。

以上是关于在 Keycloak 的更新用户配置文件中添加自定义验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keycloak 中获取最后添加的用户或更新的用户?

Keycloak:在 AngularJS 应用程序中更新用户密码

如何将“帐户”的概念添加到 Keycloak?

Webflux 和 keycloak 使用 jwt 中的方法安全级别 @Preauthorize 自定义声明而不是默认范围

如何通过 keycloak 向 github 企业中的每个用户添加主电子邮件?

使用 Keycloak Admin Java API 向用户添加角色