keycloak-多数据源配置
keycloak-连接自己的数据库
当开发UserStorage SPI时,我们可能需要访问一个非keycloak数据库来读取用户数据.
本文演示如何给keycloak加一个数据库源.
修改keycloak数据库为XA数据源
关于java分布式事务请参考JTA和XA
在standalone.xml搜索 urn:jboss:domain:datasources,在datasources标签下增加:
<xa-datasource jndi-name="java:jboss/datasources/KeycloakXADS" pool-name="KeycloakXADS">
<xa-datasource-property name="url">
jdbc:mysql://localhost:3306/keycloak?useSSL=false
</xa-datasource-property>
<driver>mysql</driver>
<security>
<user-name>root</user-name>
<password>root</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
</validation>
</xa-datasource>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
搜索<spi name="connectionsJpa">
,然后修改为:
<spi name="connectionsJpa">
<provider name="default" enabled="true">
<properties>
<property name="dataSource" value="java:jboss/datasources/KeycloakXADS"/><!--修改为XA数据源-->
<property name="showSql" value="true"/>
<property name="initializeEmpty" value="true"/>
<property name="migrationStrategy" value="update"/>
<property name="migrationExport" value="${jboss.home.dir}/keycloak-database-update.sql"/>
</properties>
</provider>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
增加自己的XA数据源
在standalone.xml搜索 urn:jboss:domain:datasources,在datasources标签下增加:
<xa-datasource jndi-name="java:jboss/datasources/DapengXADS" pool-name="DapengXADS">
<xa-datasource-property name="url">
jdbc:mysql://192.168.1.254:3306/dapeng_app?useSSL=false
</xa-datasource-property>
<driver>mysql</driver>
<security>
<user-name>root</user-name>
<password>root</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
<background-validation>true</background-validation>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
</validation>
</xa-datasource>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
在自己的SPI Extension中使用新数据源
如何编写 SPI Extension 请参考官方文档 Service Provider Interfaces (SPI)
首先在 resources/META-INF/
创建persistence.xml
:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="keycloak-dapeng" transaction-type="RESOURCE_LOCAL" >
<description>Dapeng Persistence Unit</description>
<jta-data-source>java:jboss/datasources/DapengXADS</jta-data-source>
<class>com.dapeng.cloud.models.jpa.User</class>
<properties>
<property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/emf/Dapeng"/><!--暴露为wildfly全局jndi-->
<property name="hibernate.connection.provider_disables_autocommit" value="true"/><!--注意这里设置,否则出现无法更新数据库错误-->
<property name="hibernate.hbm2ddl.auto" value="none"/><!--注意这里设置,否则容易删库!!!-->
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
hibernate.connection.provider_disables_autocommit 不配置为true的话,在进行更新操作的时候会报:
you cannot set autocommit during a managed transaction
异常。
参考资料: 暴露emf全局jndi
编写一个工具类用来获取EntityManagerFactory
:
public class JndiEntityManagerLookup {
public static EntityManager getEntityManager(String entityManagerFactoryJndiName) {
EntityManagerFactory factory = null;
try {
factory = (EntityManagerFactory)(new InitialContext()).lookup(entityManagerFactoryJndiName);
} catch (NamingException var4) {
throw new RuntimeException(var4);
}
return factory.createEntityManager();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
然后在你的ProviderFactory.create
中就可以愉快的使用新加的数据源了,剩下的请自由发挥:
public DapengUserStorageProvider create(KeycloakSession keycloakSession, ComponentModel componentModel) {
EntityManager em=JndiEntityManagerLookup.getEntityManager(EMC_JNDI);
return new DapengUserStorageProvider(keycloakSession,componentModel,em);
}
- 1
- 2
- 3
- 4
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wzslw@163.com
文章标题:keycloak-多数据源配置
文章字数:854
本文作者:武继明
发布时间:2020-05-11, 17:08:40
最后更新:2020-08-21, 06:30:57
原始链接:https://www.omingo.com/2020/05/11/keycloak-多数据源配置/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。
来做第一个留言的人吧!