Keycloak自定义验证输出消息



我使用的是jboss keycloak 1.5最终版本。我开发了与keycloak属性和用户企业数据库接口的自定义用户联合提供程序。

我的需要是向用户发送登录界面自定义错误消息,基于与我的遗留用户db相关的特定错误。

我看到keycloak主题有一个资源文件夹,我可以通过它来本地化和添加新消息。然后我可以通过angular js使用

来引用它们
$myMessage

符号。问题是我想从keycloak服务器上升一条消息。我的用户联合提供程序实现了UserFederationProvider接口。所以我必须重写:

@Override
public CredentialValidationOutput validCredentials(RealmModel realm, UserCredentialModel credential) {
    LOGGER.info("validCredentials(realm, credential)");
    return CredentialValidationOutput.failed();
}

这似乎是我正在寻找的方法,因为CredentialValidationOutput包含要作为验证输出发送的自定义消息。问题是这个方法永远不会被调用。

为什么?

我会贴出我自己找到的答案。

有必要开发自己的Authenticator。例如,参考Keycloak UsernameAndForm和UsernameAndFormFactory实现。

你可以在Keycloak github上找到它们的源代码:

https://github.com/keycloak/keycloak/tree/master/services/src/main/java/org/keycloak/authentication/authenticators/browser

主要的验证方法有:

public boolean validateUserAndPassword(AuthenticationFlowContext context, MultivaluedMap<String, String> inputData) {
    ...
}
 public boolean validatePassword(AuthenticationFlowContext context, UserModel user, MultivaluedMap<String, String> inputData) {
    ...
}

您可以从自定义用户联合提供程序抛出自定义异常,并在上面的两个方法中捕获它们,并添加:

catch (YourCustomException ex){
    ...
    Response challengeResponse = context.form()
                .setError("YOUR ERROR MESSAGE", me.getMandator()).createLogin();        
    context.failureChallenge(AuthenticationFlowError.INVALID_USER, challengeResponse);
        return false;
}

当然在你的项目中你必须添加

META-INF/service/org.keycloak.authentication.AuthenticatorFactory

指定AuthenticatorFactory的完整限定名。

为有效的指南,请参考Keycloak用户指南1.6.1 Final。33.3章

最新更新