Keycloak如何搭配MariaDB

设置步骤

下载Keycloak并解压

从keycloak的官网下载Keycloak后,解压到合适的位置。例如放在C:\keycloak-9.0.2这里。

下载JDK

还需要下载一份jdk才能运行keycloak。我选择的是openjdk 14Windows/x64 Builds,把它解压放在C:\jdk-14.0.1了。

修改standalone.conf.bat,设置JAVA_HOME

该文件在C:\keycloak-9.0.2\bin
因为选择用standalone.bat启动,所以需要修改standalone.conf.bat,打开它然后找到下面的代码:

1
rem set "JAVA_HOME=C:\opt\jdk1.6.0_23"

在它下一行新增一段:

1
set "JAVA_HOME=C:\jdk-14.0.1"

关系型数据库设置

然后参照文档中关系型数据库设置Relational Database Setup这一节进行设置。

下载MariaDB的JDBC驱动并解压

下载MariaDB的JDBC驱动,从MariaDB Connector/J .jar files这里的链接找到mariadb-java-client-2.6.0.jar下载回来,将它放在C:\keycloak-9.0.2\modules\system\layers\keycloak\org\mariadb\main(没有的路径部分需自行新建文件夹补齐)。可以选择右边的清华大学 TUNA 协会 (Tsinghua University TUNA Association)的镜像,在国内会更快。

新建module.xml

在同一个文件夹下新建module.xml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.3" name="org.mariadb">
<resources>
<resource-root path="mariadb-java-client-2.6.0.jar"/>
</resources>

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

修改standalone.xml

接着修改C:\keycloak-9.0.2\standalone\configuration\standalone.xml

增加<driver>

打开这个文件,搜索下面的代码段

1
2
3
4
5
6
7
8
9
10
<subsystem xmlns="urn:jboss:domain:datasources:5.0">  
<datasources>
...
<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>

增加几行mariadb的<driver>(其中的org.mariadb.jdbc.MySQLDataSource是坑点):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<subsystem xmlns="urn:jboss:domain:datasources:5.0">  
<datasources>
...
<driver name="mariadb" module="org.mariadb">
<xa-datasource-class>org.mariadb.jdbc.MySQLDataSource</xa-datasource-class>
</driver>

<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>

增加<datasource>

这个几行<drivers>之上,能找到数个<datasource>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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>
...
</datasources>
</subsystem>

我们加一个同级的MariaDB的<datasource>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<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">
<connection-url>jdbc:postgresql://localhost/keycloak</connection-url>
<driver>postgresql</driver>
<pool>
<max-pool-size>20</max-pool-size>
</pool>
<security>
<user-name>William</user-name>
<password>password</password>
</security>
</datasource>
<datasource jndi-name="java:jboss/datasources/MariadbDS" pool-name="MariadbDS" enabled="true" use-java-context="true">
<connection-url>jdbc:mariadb://localhost:3306/keycloak?useUnicode=yes&amp;characterEncoding=UTF-8&amp;autoReconnect=true</connection-url>
<driver>mariadb</driver>
<pool>
<max-pool-size>20</max-pool-size>
</pool>
<security>
<user-name>wendy</user-name>
<password>HghP201foae413JvitOrVMBo</password>
</security>
<validation>
<check-valid-connection-sql>select 1</check-valid-connection-sql>
<background-validation>true</background-validation>
<background-validation-millis>15000</background-validation-millis>
</validation>
</datasource>
...
</datasources>
</subsystem>

其中的<connection-url>jdbc:mariadb://localhost:3306/keycloak?useUnicode=yes&amp;characterEncoding=UTF-8&amp;autoReconnect=true</connection-url>指的是MariaDB使用默认的3306端口,用UTF-8编码(编码这里也是坑),<user-name>wendy</user-name><password>HghP201foae413JvitOrVMBo</password>是Keycloak访问MariaDB使用的用户名和密码(明文密码)。

修改Keycloak使用的datasource为mariadb

然后在standalone.xml中搜寻connectionsJpa,找到以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
...
<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="manual"/>
<property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/>
</properties>
</provider>
</spi>
...
</subsystem>

<property name="dataSource" value="java:jboss/datasources/KeycloakDS"/>一行后:

1
2
3
4
5
6
7
8
9
10
11
12
13
<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
...
<spi name="connectionsJpa">
<provider name="default" enabled="true">
<properties>
<property name="dataSource" value="java:jboss/datasources/MariadbDS"/>
<property name="initializeEmpty" value="true"/>
<property name="migrationStrategy" value="update"/>
<property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/>
</properties>
</provider>
...
</subsystem>

运行C:\keycloak-9.0.2\bin\standalone.bat启动Keycloak

在浏览器中打开http://localhost:8080/auth,注册管理员账号后就可以了。

其他没有讲的

  1. 可能需要手动新建一个叫keycloak的数据库
  2. 需要新建一个可以读写该数据库的用户,比如上面的wendy,并授予足够的权限,偷懒可以把keycloak.*都授权给他。

keycloak是……?

从keycloak的官网下载

MariaDB是……?

从MariaDB的官网下载,记得选择适当的版本(Version)和正确的操作系统(OS),例如10.4.12-GAMS Windows (64-bit)