Spring Boot 中的 Keycloak 无法应用 Liquibase 补丁

Posted

技术标签:

【中文标题】Spring Boot 中的 Keycloak 无法应用 Liquibase 补丁【英文标题】:Keycloak in Spring Boot cannot apply Liquibase patches 【发布时间】:2021-02-08 05:30:52 【问题描述】:

我正在尝试启动包含嵌入式 Keycloak 授权服务器 following this tutorial 的 Spring Boot 服务器。教程的代码是here。我自己的适配是一个 mysql DB,而不是 H2,通过docker-compose 启动

在服务器启动时,我在应用数据库补丁时收到此错误: Caused by: java.sql.SQLSyntaxErrorException: Table 'auth.client_session' doesn't exist。 SequelPro 抛出了同样的错误,但表格在视觉上就在那里。我通过looking around this thread 解决了这个问题。 (重启对我来说就足够了)

下一个错误来自下一个补丁,引用:keycloak java.sql.SQLSyntaxErrorException: Table 'client_attributes' already exists,而这个错误让我陷入了数据库迁移的困境,因为如果我删除它,它会回到“不存在”错误。

版本:

Spring Boot 2.2.4.RELEASE MySQL 5.7.32 org.keycloak:keycloak-dependencies-server-all:10.0.1

【问题讨论】:

【参考方案1】:

将 MySQL 的 lower_case_table_names 配置更改为 1 解决了这个问题。灵感来自this answer。

要通过docker-compose 刻录此设置,请在yaml 文件中自定义您的命令(灵感来自this repo):

db-service:
  [...]
  ports:
    - 3306:3306
  command: mysqld --lower_case_table_names=1 

还要确保表格的编码是UTF-8,以避免另一个头抓错误:keycloak Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535

其他参考资料:

Where to change the value of lower_case_table_names=2 on windows xampp KEYCLOAK-7505 Table 'client_attributes' already exists Ignore case sensitive for table name in JPA with Hibernate implementation

【讨论】:

以上是关于Spring Boot 中的 Keycloak 无法应用 Liquibase 补丁的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中的 Keycloak 无法应用 Liquibase 补丁

请求正文中的 Spring Boot Keycloak 客户端凭据

如何使 Spring Boot 适配器中的 Keycloak 策略执行器与 vaadin 一起使用

将 Keycloak 授权服务与 Spring Boot(资源服务器)一起使用

如何在嵌入式 Spring Boot Keycloak 中设置主题?

使用 Keycloak 保护 Spring Boot REST 服务时的 NullPointer