jboss - Keycloak 自定义验证输出消息

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

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

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

通过 angular js 引用它们
$myMessage

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

@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章

https://stackoverflow.com/questions/33323069/

相关文章:

git - SourceTree 将 pull 的文件视为未提交的更改

directx-12 - DirectX12 - ExecuteCommandLists 和 Pre

c# - 如何使自定义标题栏上的无边框表单可拖动?

unity3d - unity 3d backing 做奇怪的纹理

r - 使用平滑/抖动创建 "spaghetti"纵向图

isabelle - 使用集合理解的函数的终止证明

html - 滚动超出顶部或底部时操纵浏览器窗​​口的颜色

maven - hudson:maven-sonar-plugin 执行无法从服务器下载库

amazon-web-services - Ansible:为新创建的实例分配一个弹性IP

git - 如何在 GitHub 中 stash SVG 差异(或将 SVG 显示为图像)