簡體   English   中英

如何讓 Keycloak 連接到 MySQL DB?

[英]How do I get Keycloak to connect to MySQL DB?

我一直在爬取許多這樣的網站,試圖讓 Keycloak 與 MySQL 持久層一起工作。 我使用的是 docker,但我使用的是我自己的圖像,因此它從機密管理器而不是環境變量或 Docker 機密中提取密碼和其他敏感數據。 但是,除此之外,這些圖像非常接近庫存。

無論如何,我有一個 MySQL 8 容器啟動並運行,並且從 Keycloak 12.0.3 容器中,我可以很好地連接到 MySQL 容器:

# mysql -h mysql -u keycloak --password=somethingtochangelater -D keycloak -e "SHOW DATABASES;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| keycloak           |
+--------------------+

因此,實例之間的連接沒有問題,並且該用戶名/密碼可以正常訪問keycloak數據庫。

然后我運行了幾個命令來配置 Keycloak 實例(keycloak 安裝在/opt/myco/bin/keycloak ):

/opt/myco/bin/keycloak/bin/standalone.sh &

# Pausing for server startup
sleep 20

# Add mysql module - JDBC driver unpacked at /opt/myco/bin/keycloak-install/mysql-connector-java-8.0.23/mysql-connector-java-8.0.23.jar
/opt/myco/bin/keycloak/bin/jboss-cli.sh --connect --command="module add --name=com.mysql --dependencies=javax.api,javax.transaction.api --resources=/opt/myco/bin/keycloak-install/mysql-connector-java-8.0.23/mysql-connector-java-8.0.23.jar --module-root-dir=/opt/myco/bin/keycloak/modules/system/layers/keycloak/"

# Removing h2 datasource
/opt/myco/bin/keycloak/bin/jboss-cli.sh --connect --command="/subsystem=datasources/data-source=KeycloakDS:remove"

# Adding MySQL datasource
/opt/myco/bin/keycloak/bin/jboss-cli.sh --connect --command="/subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql,driver-class-name=com.mysql.cj.jdbc.Driver)"

# TODO - add connection pooling options here...
# Configuring data source
/opt/myco/bin/keycloak/bin/jboss-cli.sh --connect --command="data-source add --name=KeycloakDS --jndi-name=java:jboss/datasources/KeycloakDS --enabled=true --password=somethingtochangelater --user-name=keycloak --driver-name=com.mysql --use-java-context=true --connection-url=jdbc:mysql://mysql:3306/keycloak?useSSL=false&characterEncoding=UTF-8"

# Testing connection
/opt/myco/bin/keycloak/bin/jboss-cli.sh --connect --command="/subsystem=datasources/data-source=KeycloakDS:test-connection-in-pool"

# Creating admin user
/opt/myco/bin/keycloak/bin/add-user-keycloak.sh -r master -u "admin" -p "somethingelse"

# Shutting down initial server
/opt/myco/bin/keycloak/bin/jboss-cli.sh --connect command=":shutdown"

這一切似乎運行良好。 特別注意test-connection-in-pool沒有問題:

{
    "outcome" => "success",
    "result" => [true],
    "response-headers" => {"process-state" => "reload-required"}
}

但是,當我 go 再次啟動服務器備份時,它會崩潰並出現幾個異常,首先是:

22:31:52,484 FATAL [org.keycloak.services] (ServerService Thread Pool -- 56) Error during startup: java.lang.RuntimeException: Failed to connect to database
        at org.keycloak.keycloak-model-jpa@12.0.3//org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getConnection(DefaultJpaConnectionProviderFactory.java:377)
        at org.keycloak.keycloak-model-jpa@12.0.3//org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lazyInit(LiquibaseDBLockProvider.java:65)
...

它繼續運行,盡管我懷疑 Exception 最終是致命的,它最終死於:

22:31:53,114 ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 40) WFLYCTL0190: Step handler org.jboss.as.controller.AbstractAddStepHandler$1@33063168 for operation add at address [
    ("subsystem" => "jca"),
    ("workmanager" => "default"),
    ("short-running-threads" => "default")
] failed -- java.util.concurrent.RejectedExecutionException: java.util.concurrent.RejectedExecutionException
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.RejectingExecutor.execute(RejectingExecutor.java:37)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.rejectShutdown(EnhancedQueueExecutor.java:2029)
...

/opt/myco/bin/keycloak/modules/system/layers/keycloak/com/mysql/main的模塊有 jar 文件和 module.xml:

# ls
module.xml  mysql-connector-java-8.0.23.jar
# cat module.xml
<?xml version='1.0' encoding='UTF-8'?>

<module xmlns="urn:jboss:module:1.1" name="com.mysql">

    <resources>
        <resource-root path="mysql-connector-java-8.0.23.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>

Standalone.xml 文件對我來說看起來很合理:

...
        <subsystem xmlns="urn:jboss:domain:datasources:6.0">
            <datasources>
...
                <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:mysql://mysql:3306/keycloak?useSSL=false&amp;characterEncoding=UTF-8</connection-url>
                    <driver>com.mysql</driver>
                    <security>
                        <user-name>keycloak</user-name>
                        <password>somethingtochangelater</password>
                    </security>
                </datasource>
                <drivers>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                    <driver name="mysql" module="com.mysql">
                        <driver-class>com.mysql.cj.jdbc.Driver</driver-class>
                    </driver>
                </drivers>
            </datasources>
...

所以....有人知道發生了什么嗎? 我還需要做什么才能讓 Keycloak 與 MySQL 正常對話? 我還能做些什么來調試問題所在?

不確定您的特定情況有什么問題,但我使用了 jboss/keycloak 圖像,它可以很好地連接到 MySQL。 也許您可以從那里獲得您的自定義圖像。 我的博客文章https://link.medium.com/eK6IRducpeb中的完整設置

對於獨立的 keycloak 服務器,您可以嘗試此命令。

kc.bat start-dev --db postgres --db-url jdbc:postgresql://localhost:5432/keycloak-server --db-username postgres --db-password root

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM