首页 > 解决方案 > 如何在 Keycloak 中初始化多个 UserProviders

问题描述

我在尝试让 Keycloak 使用在 Keycloak(包:org.keycloak.models.jpa.JpaUserProviderFactory)中实现的默认 JPA 提供程序以及我的自定义 UserProvider 时遇到很大困难。

我的用户提供程序是这样实现的:

public class MyCustomUserProviderFactory extends JpaUserProviderFactory {
  @Override
  public String getId() {
    return "demo";
  }

  @Override
  public UserProvider create(KeycloakSession session) {
    EntityManager em = session.getProvider(JpaConnectionProvider.class).getEntityManager();
    return new MyCustomUserProvider(session, em);
  }
}

和 MyCustomUserProvider

public class MyCustomUserProvider extends JpaUserProvider {
  private final KeycloakSession session;

  public MyCustomUserProvider(KeycloakSession session, EntityManager em) {
    super(session, em);
    this.session = session;
  }

}

启动.cli

/subsystem=keycloak-server/spi=user:add(default-provider=demo)
/subsystem=keycloak-server/spi=user/provider=jpa:add(enabled=true)
/subsystem=keycloak-server/spi=user/provider=demo:add(enabled=true)

在 META-INF/service 我也有

org.keycloak.models.UserProviderFactory

与 com.demo.keycloak.providers.user.MyCustomUserProviderFactory

因此,通过此实现和设置,keycloak 已成功启动,但是当我需要同时访问 demo 和 jpa UserProvider 时,我只能获得默认提供程序,即在本例中为 demo。

我通过以下方式访问 UserProvider:

UserProvider demoProvider = session.getProvider(UserProvider.class, "demo");

但如果我执行

UserProvider jpaProvider = session.getProvider(UserProvider.class, "jpa");

我只得到空值。如果我更改了 startup.cli (default-provider=demo) 中的默认提供程序,我将获得 jpa 而不是演示提供程序。

有人可以向我解释我如何拥有多个 UserProvider 实现以及如何访问它们?

标签: single-sign-onkeycloakkeycloak-services

解决方案


推荐阅读