Keycloak自定义验证输出消息

时间:2015-10-24 20:35:46

标签: jboss output single-sign-on message keycloak

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

我的需求是根据与我的旧用户数据库相关的特定特定错误向用户发送登录界面自定义错误消息。

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

通过角度js引用它们
$myMessage

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

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

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

为什么?

1 个答案:

答案 0 :(得分:3)

我会发布自己发现的答案。

开发自己的身份验证器是必要的。例如,请参阅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章