This is the final solution:
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;
}
standalone.xml in jboss:domain:ee subsystem
<global-modules>
<module name="org.keycloak.keycloak-core"/>
<module name="org.keycloak.keycloak-admin-client"/>
</global-modules>
In lieu of the above, I added the dependencies in the jboss deployment descriptor of the installed custom SPI jar file
<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>
Installing the keycloak-admin-client module, make sure keycloak-admin-client-14.0.0.jar is available in /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"