无法将 postgres 与 keycloak 一起使用
Posted
技术标签:
【中文标题】无法将 postgres 与 keycloak 一起使用【英文标题】:Unable to use postgres with keycloak 【发布时间】:2020-06-05 19:45:51 【问题描述】:我正在尝试将 postgres 与 keycloak 一起使用。关注Doc
$ ls keycloak-9.0.0/modules/system/layers/keycloak/org/postgresql/main
config.xml postgresql-42.2.10.jar
这是 config.xml 文件。 config.xml
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">
<resources>
<resource-root path="postgresql-42.2.10.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
这些是我在standalone.xml 中所做的更改 standalone.xml
<datasources>
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
<connection-url>jdbc:postgresql://localhost:5432/test</connection-url>
<driver>postgresql</driver>
<pool>
<max-pool-size>20</max-pool-size>
</pool>
<security>
<user-name>postgres</user-name>
<password>StrongPassword</password>
</security>
</datasource>
<drivers>
<driver name="postgresql" module="org.postgresql">
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
<default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/KeycloakDS">
我得到的错误。 错误
06:13:39,430 ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 32) WFLYCTL0013: Operation ("add") failed - address: ([
("subsystem" => "datasources"),
("jdbc-driver" => "postgresql")
]) - failure description: "WFLYJCA0115: Module for driver [org.postgresql] or one of it dependencies is missing: [org.postgresql]"
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:我能否建议另一种不太可能出现问题的配置方式?我使用以下内容来配置 PostgreSQL 和 Keycloak,并且运行良好。关键是针对停止的 Keycloak 运行它(使用全新安装)。将以下内容保存到setup-keycloak.cli
:
embed-server --server-config=standalone.xml --std-out=echo
batch
#
# remove the default provided datasource
#
/subsystem=datasources/data-source=KeycloakDS/:remove
#
# add them
#
module add --name=org.postgres --resources=/path/to/postgresql-42.2.10.jar --dependencies=javax.api,javax.transaction.api
/subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver)
/subsystem=datasources/data-source=KeycloakDS/:add(connection-url=jdbc:postgresql://localhost:5432/keycloak_database,driver-name=postgres,jndi-name=java:jboss/datasources/KeycloakDS,initial-pool-size=4,max-pool-size=64,min-pool-size=4,password=keycloak_user,user-name=keycloak_pass)
run-batch
然后使用$KEYCLOAK_HOME/bin/jboss.sh --file=setup-keycloak.cli
运行它。这将删除 KeycloakDS 数据源,添加 PostgreSQL 模块,并使用您的参数重新创建 KeycloakDS 数据源。只要您有 PostgreSQL JDBC 驱动程序的本地副本,您就可以随时使用它来重现配置。
【讨论】:
使用 keycloak 11.0.2 命令更改为$KEYCLOAK_HOME/bin/jboss-cli.sh --file=setup-keycloak.cli
当您说“重新创建”或“重现”时,这意味着您之前在 Keycloak 中的配置(领域、客户端、用户)保留在新配置中?还是我会丢失所有数据?
@DavidCG - 那是另一回事。如果您重新创建数据库,您将丢失数据。查看Export and Import 管理员指南以从您的数据库中复制数据。
任何尝试 2021 年及以后的人,只需将 jar 放入 bin 文件夹并写入 --resources=postgresql-42.2.10.jar。它会自动在 bin 文件夹中查找 jar。
@stdunbar:您在脚本中执行此操作的方式。您的脚本可以工作,但在我的情况下,jar 必须放在 bin 文件夹中才能正常工作。否则找不到路径。【参考方案2】:
我认为您的问题是您将设置命名为 config.xml
并且应该是 module.xml
。
其次,您必须将 postgresql jar 下载到该位置:
curl -O https://jdbc.postgresql.org/download/postgresql-X.X.X.jar > /opt/keycloak/modules/system/layers/keycloak/org/postgresql/main
只需将 X.X.X 替换为您的版本即可。
然后重启服务器。
PS:您应该使用保险库作为您的密码。
【讨论】:
PS: you should use a vault for your password.
如果数据库在本地主机上,为什么要使用 vault?如果保管库是外部服务,则会引入更多安全漏洞的可能性
你可以做任何你想做的事,但请记住 keycloak 是 bin/vault.sh 附带的,你也可以在本地使用它。并且在某些时候,您会想在其他地方使用您的密钥斗篷,而不仅仅是在您的本地主机上。【参考方案3】:
这对我有用。
在 基本目录 (keycloak-11.0.2/modules/system/layers/base/com/postgresql/) 中创建 PostgreSQL module.xml(不是 config.xml) )
更新standalone.xml
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true"
statistics-enabled="$wildfly.datasources.statistics-enabled:$wildfly.statistics-enabled:false">
<connection-url>jdbc:postgresql://localhost:5432/keycloak</connection-url>
<driver>postgresql</driver>
<security>
<user-name>db-user</user-name>
<password>db-pass</password>
</security>
</datasource>
<drivers>
<driver name="postgresql" module="com.postgresql.h2">
<driver-class>org.postgresql.Driver</driver-class>
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
【讨论】:
【参考方案4】:这对我来说是独立的:
-
在文件 module.xml 中
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">
<resources>
<resource-root path="postgresql-42.2.23.jar" />
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
2.在standalone.xml文件中
<datasources>
<datasource jndi-name="java:jboss/datasources/KeycloakDS"
pool-name="KeycloakDS"
enabled="true"
use-java-context="true"
statistics-enabled="$wildfly.datasources.statistics-enabled:$wildfly.statistics-enabled:false" >
<connection-url>jdbc:postgresql://192.168.1.XX:5432/Your-DataBase</connection-url>
<driver>postgresql</driver>
<pool>
<max-pool-size>20</max-pool-size>
</pool>
<security>
<user-name>UserName</user-name>
<password>**********</password>
</security>
<statement>
<prepared-statement-cache-size>32</prepared-statement-cache-size>
<share-prepared-statements>true</share-prepared-statements>
</statement>
</datasource>
<drivers>
<driver name="postgresql" module="org.postgresql">
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
3.in 文件standalone.xml
<default-bindings
context-service="java:jboss/ee/concurrency/context/default"
datasource="java:jboss/datasources/KeycloakDS"
managed-executor-service="java:jboss/ee/concurrency/executor/default"
managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default"
managed-thread-factory="java:jboss/ee/concurrency/factory/default"/>
【讨论】:
【参考方案5】:对于那些从 Dockerized jboss/keycloak
实例的教程来到这里的人,您无需任何配置即可内置 rdbms
支持:https://hub.docker.com/r/jboss/keycloak/
docker run -p 8080:8080 -e KEYCLOAK_USER=kuser -e KEYCLOAK_PASSWORD=kpass -e DB_VENDOR=postgres -e DB_ADDR=host:port -e DB_DATABASE=postgres -e DB_USER=pguser -e DB_PASSWORD=pgpass jboss/keycloak:15.0.2
【讨论】:
以上是关于无法将 postgres 与 keycloak 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 我无法切换 keycloak 和基本身份验证
错误 org.keycloak.adapters.OAuthRequestAuthenticator - 无法将代码转换为令牌
docker compose fullstack example -- keycloak web grant-type: password