這一節(jié)中,我們來看看如何為Keycloak配置數(shù)據(jù)庫(kù)席噩。默認(rèn)情況下媳瞪,Keycloak使用的是輕量級(jí)的內(nèi)嵌數(shù)據(jù)庫(kù)H2何之,作為學(xué)習(xí)是足夠的,但在生成環(huán)境下還需為其配置功能更強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)。
Keycloak數(shù)據(jù)持久化使用了兩層結(jié)構(gòu),底層為JDBC用于連接具體的數(shù)據(jù)庫(kù),上層為Hibernate JPA开睡,用于實(shí)現(xiàn)ORM。在本節(jié)中苟耻,我們將使用Posgres作為示例進(jìn)行演示篇恒,配置如下:
- Keycloak 8.0.1
- Docker (用于運(yùn)行數(shù)據(jù)庫(kù)實(shí)例)
- Postgres 9.6.17
- JDBC driver postgresql-42.2.11
使用Docker運(yùn)行本地?cái)?shù)據(jù)庫(kù)
使用了官方的鏡像postgres:9.6.17,運(yùn)行如下命令
docker run -p 5432:5432 --name my-postgres -e POSTGRES_PASSWORD=123456 -e POSTGRES_USER=root -e POSTGRES_DB=keycloak -d postgres:9.6.17
其中通過-e
來指定了用戶名和密碼凶杖,同時(shí)配置了初始的數(shù)據(jù)庫(kù)keycloak
胁艰。運(yùn)行后,可使用Navcat
來查看數(shù)據(jù)庫(kù)是否正常運(yùn)行。
配置JDBC driver
地址為:https://jdbc.postgresql.org/download.html在這里給出了不同的driver版本腾么,官方建議沒有特殊需求可直接使用最新的版本奈梳,此時(shí)最新的為42.2.11。同時(shí)還需要注意JDBC 4.x的版本需要解虱,由于Keycloak使用的是Java 8攘须,所以可以采用JDBC 4.2。
下載后需要把該jar包放在指定的位置殴泰,路徑為:keycloak-8.0.1/modules/system/layers/keycloak/org/postgresql/main/postgresql-42.2.11.jar
于宙,此時(shí)會(huì)發(fā)現(xiàn)在org
下并沒有postgresql
目錄,手動(dòng)創(chuàng)建即可悍汛。同時(shí)還需要為其添加配置文件捞魁,目的是讓wildfly可以讀取到該JDBC driver,配置文件和jar包在同一目錄下即可:
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">
<resources>
<resource-root path="postgresql-42.2.11.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
由于在同級(jí)目錄下离咐,resource-root path
直接賦值為當(dāng)前的jar文件名谱俭。
配置DataSource
為了讓Keycloak啟動(dòng)后可以直接使用到我們外置的數(shù)據(jù)庫(kù),需要將原先使用H2的配置宵蛀,更改為Postgres昆著。根據(jù)不同的部署方式术陶,需要更改不同的配置文件凑懂,對(duì)于單體應(yīng)用而言,需要修改standalone/configuration/standalone.xml
瞳别,而對(duì)于集群部署征候,則需要修改standalone/configuration/standalone-ha.xml
杭攻。在配置文件中祟敛,可根據(jù)關(guān)鍵詞datasource
進(jìn)行搜索
<subsystem xmlns="urn:jboss:domain:datasources:5.0">
<datasources>
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
<driver>h2</driver>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
</datasource>
<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>
<pool>
<max-pool-size>20</max-pool-size>
</pool>
<security>
<user-name>root</user-name>
<password>123456</password>
</security>
</datasource>
<drivers>
<driver name="postgresql" module="org.postgresql">
<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>
</datasources>
</subsystem>
在drivers這個(gè)tag下,原先只有h2兆解,此時(shí)我們添加了postgresql馆铁。同時(shí)在上方的datasource中,將KeycloakDS下的配置也需要修改為postgresql锅睛。這里的配置無(wú)需過多說明埠巨,比較容易理解。
此外還有關(guān)于數(shù)據(jù)庫(kù)的一些配置现拒,如初始化方式辣垒,migration策略等,可以保持默認(rèn)即可:
<spi name="connectionsJpa">
<provider name="default" enabled="true">
<properties>
<property name="dataSource" value="java:jboss/datasources/KeycloakDS"/>
<property name="initializeEmpty" value="true"/>
<property name="migrationStrategy" value="update"/>
<property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/>
</properties>
</provider>
</spi>
initializeEmpty
:當(dāng)數(shù)據(jù)庫(kù)為空時(shí)印蔬,是否自動(dòng)進(jìn)行初始化勋桶,若設(shè)置為false,則需要手動(dòng)進(jìn)行初始化。
migrationStrategy
:migration策略例驹,可選的有update, manual 和 validate捐韩。
檢驗(yàn)
配置完成后,運(yùn)行./standalone.sh
即可運(yùn)行鹃锈,通過Navcat可以查看到Keycloak默認(rèn)創(chuàng)建的表: