[英]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.