9.13. 配置多个数据源
Red Hat build of Keycloak 允许您指定额外的数据源,以防需要从扩展访问另一个数据库。这在使用红帽构建的 Keycloak 数据源是存储自定义数据的可行选项(如用户)时很有用。
您可以在 {developerguide_userstoragespi_name} 文档中找到有关如何连接到您自己的用户数据库的更多详细信息。
定义多个数据源的工作方式类似于定义单个数据源,一个重要的更改 - 您必须为每个数据源指定一个名称作为配置选项名称的一部分。
9.13.1. 所需的配置 复制链接链接已复制到粘贴板!
要启用额外的数据源,您需要设置 2 个内容 - JPA persistence.xml 文件和红帽构建的 Keycloak 配置。persistence.xml 文件充当 Jakarta Persistence API 标准的一部分,需要正确配置到 Hibernate ORM 框架。使用 persistence.xml 文件完成部分后,您需要相应地设置红帽构建的 Keycloak 配置。
额外的数据源属性可以通过标准配置源(如 CLI、keycloak.conf 或环境变量)指定。
额外的数据源可以像主数据源一样配置。这可以通过对配置选项使用类名称来实现,这还包括附加数据源的名称。例如,当主数据源使用 db-username 时,另一个是 db- username-<datasource>。有关相关选项的完整列表,请参见相关选项章节。
9.13.1.1. 1.JPA persistence.xml 文件 复制链接链接已复制到粘贴板!
persistence.xml 为 Jakarta Persistence API (langpack)提供配置,如它应管理哪些实体、数据源名称、JDBC 设置、JPA/Hibernate 自定义设置等。该文件需要放在自定义红帽构建 Keycloak 扩展的 META-INF/persistence.xml 文件夹中。
请注意,Quarkus 提供了通过 Hibernate ORM 属性设置 JPA Persistence 单元,而不使用 persistence.xml 文件。但是,红帽构建的 Keycloak 支持的方法是使用 persistence.xml 文件,如果存在该文件,则忽略 Quarkus 属性。
在 Red Hat build of Keycloak 中,大多数配置都是自动的,您只需要提供基本配置详情 - 数据源名称和事务类型。
红帽构建的 Keycloak 需要将额外数据源的事务类型设置为 JTA。您可以为这个最小 persistence.xml 文件设置事务类型和数据源名称:
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
version="3.0">
<persistence-unit name="user-store-pu" transaction-type="JTA">
<class>org.your.extension.UserEntity</class>
<properties>
<property name="jakarta.persistence.jtaDataSource" value="user-store" />
</properties>
</persistence-unit>
</persistence>
要正确设置数据源名称,您应该设置 jakarta.persistence.jtaDataSource 属性。如果没有设置,持久性单元名称将用作数据源名称(在这种情况下,user-store-pu )。在上例中,生成的数据源名称为 user-store。数据源名称可以与持久性单元名称相同。
要使用您自己的 JPA 实体,您需要提供 < class> 属性来标记由此持久性单元管理的 JPA 实体,并定向到特定的数据源。在上例中,org.your.extension.UserEntity JPA 实体将由 persistence 单元 user-store-pu 进行管理,并定向到 user-store 数据源。
9.13.1.2. 2.必要属性 复制链接链接已复制到粘贴板!
设置 persistence.xml 后,红帽构建的 Keycloak 端的最小配置是指定数据源的 DB kind/vendor 设置。您需要指定构建时间选项 db-kind-<name& gt;,其中 & lt;name> 是数据源的名称,且必须与 persistence.xml 文件中指定的 相同。
因此,您可以启用额外的数据源 user-store (例如postgres ):
bin/kc.[sh|bat] start --db-kind-user-store=postgres
为数据源指定 db-kind 后,会自动应用所有特定于 database-kind 的默认值(如驱动程序和 dialect)的默认值,就像主数据源一样。
9.13.2. 通过环境变量配置 复制链接链接已复制到粘贴板!
如果您不想通过 CLI 或 keycloak.conf 属性配置数据源,您可以使用环境变量。
您可以通过环境变量(用于 user-store 数据源)设置 DB kind,如下所示:
export KC_DB_KIND_USER_STORE=postgres
export KC_DB_USERNAME_USER_STORE=my-username
由于环境变量的默认映射,它映射到 db 和 - kind-user-storedb-username-user-store 红帽构建的 Keycloak 属性。但有时候,数据源的名称可能包含一些特殊字符,如 _、$ 或 。
要通过红帽构建的 Keycloak 环境变量正确配置它,您需要明确指出数据源的密钥应是什么样子。您可以使用一对唯一红帽构建的 Keycloak 环境变量,以及 KCKEY_ 的特殊案例。
例如,对于名为 user_store$ marketing 的数据源,您可以按如下方式设置环境变量:
export KC_USER_STORE_DB_KIND=mariadb
export KCKEY_USER_STORE_DB_KIND=db-kind-user_store$marketing
您可以参阅 Configuring Red Hat build of Keycloak, in 子小节中 用于带有特殊字符 的环境变量键的内容。
9.13.3. quarkus.properties的向后兼容性 复制链接链接已复制到粘贴板!
在过去,我们指示用户使用原始 Quarkus 属性在某些位置配置额外的数据源。但是,如在 conf/quarkus.properties 文件中使用 Quarkus 属性被视为 不受支持,强烈建议您使用专用的附加数据源选项,如上面所述。
在能够迁移到专用选项前,您仍然可以通过 Quarkus 属性指定数据源设置,如下所示:
quarkus.datasource.user-store.db-kind=h2
quarkus.datasource.user-store.username=sa
quarkus.datasource.user-store.jdbc.url=jdbc:h2:mem:user-store;DB_CLOSE_DELAY=-1
quarkus.datasource.user-store.jdbc.transactions=xa
对数据源名称使用 Quarkus 属性,作为带引号的数据源名称 clash 的属性,带有新的数据源选项映射。因此,使用 quarkus.datasource.user-store.db-kind=h2,而不是 quarkus.datasource."user-store".db-kind=h2 来防止任何问题。