首页 > 解决方案 > Keycloak 联合用户 - 在自定义 SPI 中触发密码重置电子邮件

问题描述

我们实现了一个 keycloak SPI 来对外部用户数据库执行查找/更新。

我们想要实现的功能之一是在用户达到一定数量的登录尝试时触发电子邮件。这是我们在应用程序的 pre-keycloak 版本中所做的事情,并试图实现此功能。

该指南是通过提供“UPDATE_PASSWORD”所需的操作以及其他输入来使用 execute-actions-email admin REST 端点。但我一直收到 403 响应。

如果在自定义 SPI 中有一种使用 Keycloak Java API 的方法,我正在环顾四周。我在 UserResource 中找到了 executeActionsEmail 方法的实现。但这需要一些额外的初始化(我认为主要是管理员权限)。我也被困在这里。

我正在寻找任何可以帮助我理解如何实现这个用例的工作示例。Postman,Java API 任何东西都会受到高度赞赏。

谢谢,

标签: keycloakkeycloak-rest-api

解决方案


这是最终的解决方案:

    private boolean triggerExecuteActionsEmailAdminClient(RealmModel realm, UserModel user) {
    boolean executed = false;
    try {
        KeycloakContext context = keycloakSession.getContext();
        UriInfo backendUriInfo = context.getUri(UrlType.BACKEND);

        String backendBaseUri = backendUriInfo.getBaseUri().toString();
        log.info(String.format("backendBaseUri: %s", backendBaseUri));

        Keycloak keycloak = KeycloakBuilder.builder().serverUrl(backendBaseUri).realm("master")
                .clientId("admin-cli").grantType("password").username("admin").password("******")
                .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build()).build();
        String realmName = realm.getName();
        String userId = user.getId();

        keycloak.realm(realmName).users().get(userId).executeActionsEmail(Arrays.asList("UPDATE_PASSWORD"));
        executed = true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return executed;
}
jboss:domain:ee 子系统中的standalone.xml
        <global-modules>
            <module name="org.keycloak.keycloak-core"/>
            <module name="org.keycloak.keycloak-admin-client"/>
        </global-modules>
代替上述,我在已安装的自定义 SPI jar 文件的 jboss 部署描述符中添加了依赖项
<jboss-deployment-structure>
<deployment>
    <dependencies>
        <module name="org.springframework.security" />
        <module name="com.oracledatabase.oracle" />
        <module name="org.keycloak.keycloak-core"/>
        <module name="org.keycloak.keycloak-server-spi"/>
        <module name="org.keycloak.keycloak-server-spi-private"/>
        <module name="org.keycloak.keycloak-services"/>
        <module name="org.keycloak.keycloak-saml-core-public"/>
        <module name="org.keycloak.keycloak-admin-client"/>            
        <module name="org.jboss.logging"/>                      
    </dependencies>
</deployment>

安装 keycloak-admin-client 模块,确保 keycloak-admin-client-14.0.0.jar 在 /tmp 中可用

sudo $KEYCLOAK_HOME/bin/jboss-cli.sh --command="module add --name=org.keycloak.keycloak-admin-client --resources=/tmp/keycloak-admin-client-14.0.0.jar --dependencies=org.keycloak.keycloak-core,org.keycloak.keycloak-common,org.apache.httpcomponents,javax.ws.rs.api,org.jboss.resteasy.resteasy-jaxrs"

推荐阅读