在 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 找到了解决方案。步骤如下:
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<FormMessage> errors
之后添加此行:
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
绑定所需的身份提供程序
【讨论】:
是否可以使您的代码适应Registration
工作流程?
@FredericoSchardong 这是不可能的,因为它是从不同的 SPI 派生的,但您可以调整程序。也许从自定义 default registration form 开始
谢谢。我最终使用了实验性的user profile。以上是关于在 Keycloak 的更新用户配置文件中添加自定义验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 keycloak 中获取最后添加的用户或更新的用户?
Keycloak:在 AngularJS 应用程序中更新用户密码
Webflux 和 keycloak 使用 jwt 中的方法安全级别 @Preauthorize 自定义声明而不是默认范围