繁体   English   中英

带有 PostgreSQL 驱动程序的 Keycloak 中的 UserStorage SPI

[英]UserStorage SPI in Keycloak with PostgreSQL driver

我正在尝试将 Keycloak 实例链接到外部用户源,即 PostgreSQL 数据库。 我遵循了 Keycloak 的示例,了解如何实现自定义用户联合提供程序,该提供程序与包含用户名/密码对的属性文件一起使用,并且按预期工作。

从那里开始,我稍微更改了代码,以便它连接到我的用户数据库而不是读取属性文件,但是在提供程序初始化时出现此错误:

Failed to init CustomProviderFactory: java.sql.SQLException: No suitable driver found for jdbc:postgresql://postgres:5432/users_db

我使用 postgres 容器运行 Docker Compose 配置,这就是为什么我的数据库主机简称为postgres的原因。 (我可以使用该主机名从同一网络上的另一个容器psql进入我的数据库,所以我认为这不是我的问题的原因。) Keycloak 容器使用自定义图像,将我的 SPI 复制到提供程序目录中。 如果需要,这里是 Dockerfile:

FROM quay.io/keycloak/keycloak:latest as builder

# Install custom providers
COPY target/custom-user-provider.jar /opt/keycloak/providers
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/
WORKDIR /opt/keycloak
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]

我的问题可能是我的 pom.xml 中的org.postgresql.postgresql:42.4.2依赖项。 I've tried multiple artifacts configurations including a JAR with dependencies, a JAR without dependencies and a fat JAR but I'm no expert in Java and I'm not sure I'm building my JAR correctly.

这是我的 SPI 实现中的一些代码,包括它尝试连接到 postgres 的行:

CustomUserProviderFactory.java

public class CustomUserProviderFactory implements UserStorageProviderFactory<CustomUserProvider> {
    public static final String PROVIDER_NAME = "custom-user-storage";
    private static final Logger logger = Logger.getLogger(CustomUserProviderFactory.class);

    protected UserRepository userRepository;

    @Override
    public void init(Config.Scope config) {
        try {
            userRepository = new UserRepository();
            logger.error("Loaded users database");
        } catch (SQLException ex) {
            logger.error("Failed to init CustomProviderFactory", ex);
        }

    }

    @Override
    public CustomUserProvider create(KeycloakSession session, ComponentModel model) {
        return new CustomUserProvider(session, model, userRepository);
    }

    @Override
    public String getId() {
        return PROVIDER_NAME;
    }
}

UserRepository.java

public class UserRepository {
    private static final Logger logger = Logger.getLogger(UserRepository.class);

    private final static String url = "jdbc:postgresql://postgres:5432/users_db";
    private final static String username = "user";
    private final static String password = "password";
    private final Connection conn;

    public UserRepository() throws SQLException {
        // Error is thrown here
        conn = DriverManager.getConnection(url, username, password);
    }

    public User getByEmail(String email) throws SQLException {
      // Query user from DB
    }
}

尝试添加Class.forName("org.postgresql.Driver"); 之前conn = DriverManager.getConnection(url, username, password); 看看它是否能解决你的问题(见这个)。

如果您还使用 postgres 作为主要 Keycloak 数据库,只需将构建命令更改为:

RUN /opt/keycloak/bin/kc.sh build --db postgres

如果您使用其他数据库,则需要手动添加 JDBC 驱动程序。 只需将驱动程序 JAR 复制到/opt/keycloak/providers

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM