如何在分布式环境中将数据库连接参数传递给Keycloak

时间:2020-08-20 12:44:39

标签: docker keycloak

我正在使用在Docker容器中运行的Keycloak服务器。

我开发了一个用户存储提供程序以连接到客户端数据库,以搜索用户信息和登录验证。

我在代码内部编写了数据库连接属性,但是现在是时候正确地做到这一点了,例如在启动时向Docker容器提供该信息并从代码中获取该信息。

我想我的UserStorageProviderFactory的init(Config.Scope config)方法是查找这些参数的地方。这里的config参数包含文件standalone.xml中的信息,但是我需要在启动时将连接参数传递给Docker,以便可以轻松地对其进行修改。

我怎么能这样呢?

2 个答案:

答案 0 :(得分:1)

您可以使用jboss-cli脚本将您的UserStorageProvider添加到独立的/-ha.xml,其属性可以由传递给容器的环境变量设置。

示例:

假设我们有一个spi.cli脚本,其中包含以下内容:

/subsystem=keycloak-server/spi=my-spi/provider=my-custom-auth-provider:add(enabled=true,properties={"my.custom.property", "${env.MY_ENV:myDefaultValue}"})

可以将其放在容器的/opt/jboss/startup-scripts文件夹中以在启动时自动运行,请参见Keycloak docker documentation

运行时,它将独立生成以下内容:

<spi name="my-spi">
    <provider enabled="true" name="my-custom-auth-provider">
        <properties>
            <property name="my.custom.property" value="${env.MY_ENV:myDefaultValue}"/>
        </properties>
    </provider>
</spi>

然后可以使用init方法中的Config.Scope通过代码访问这些属性。 例如config.get("my.custom-property")

这将检索传递给容器-e MY_ENV=test_value的值。

答案 1 :(得分:0)

Docker容器必须使用-e选项运行,例如:

-e ENV_VAR_1=env_var_value1

它可能包含所需的-e选项。另一种方法是使用--env-file选项附加文件中包含的变量。

然后在用户存储提供者代码中,您可以检查环境变量的值,例如:

System.getenv("ENV_VAR_1")