如何使用Docker中的CLI使用MySQL数据库来设置KeyCloak
#database #mysql #docker #keycloak

1.简介

KeyCloak是由Redhat支持的最流行的开源身份和访问管理平台之一。它以其灵活性和可扩展性而闻名,使其成为企业世界中的顶级候选人,那里有复杂的用户验证和授权用例。例如,多个应用程序必须支持单个登录名的多租户和n-Reseller级别。

1.1先决条件

需要以下知识。

  • Keycloak
  • Docker
  • mysql

2. CT-Keycloak-am

ct-keycloak-am是我开发的一个项目,旨在在Docker容器中提供自定义的KeyCloak服务器。它包括一个默认领域,自定义主题,数据库连接(MySQL)和自定义SPI(必需的赞助)。

它包含CLI脚本,该脚本将下载KeyCloak服务器并安装MySQL数据源。

该项目可在https://github.com/czetsuya/ct-keycloak-iam

上获得

我们将使用的文件夹/文件。

keycloak-docker-emembly

  • Docker
    • Dockerfile-构建自定义KeyCloak容器
    • docker-compose-dev.yml-构建并运行自定义KeyCloak容器和MySQL。
  • src/main/资源
    • 建造
      • CLI/DATABASE/MYSQL
      • set -database.cli-一组指令,以在keycloak配置中创建MySQL数据源和驱动程序的条目。请注意,它使用Docker-Compose文件中定义的环境变量。
      • build-keycloak.sh
    • 模块/数据库/mysql
      • module.xml- KeyCloak所需的MySQL模块文件。确保该版本与Dockerfile中定义的版本匹配(而不是更改)

3. Docker组成

我们将使用MySQL Docker映像来完成工作。

,我们将使用MySQL数据库,用户和权限。

我们需要将MySQL连接设置定义为环境变量。

version: '3'

services:
  keycloak-db:
    image: mysql:8.0
    ports:
      - 33066:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: keycloak
      MYSQL_USER: keycloak
      MYSQL_PASSWORD: keycloak
    command: mysqld --sql_mode=""

  ct-keycloak-iam:
    depends_on:
      - keycloak-db
    build:
      context: ../
      dockerfile: docker/Dockerfile
    ports:
      - 8888:8888
      - 8080:8080
      - 8443:8443
      - 9990:9990
    environment:
      DB_ADDR: keycloak-db
      DB_PORT: 3306
      DB_DATABASE: keycloak
      DB_USER: keycloak
      DB_PASSWORD: keycloak
      DB_JDBC_PARAMS: useSSL=false&allowPublicKeyRetrieval=true

      KEYCLOAK_IMPORT: /opt/jboss/keycloak_install_stage/realms/ct-realm-dev.json
      KEYCLOAK_USER: keycloak.admin
      KEYCLOAK_PASSWORD: keycloak.admin

      KC_HOSTNAME_STRICT: false

      DEBUG_PORT: 8888
      PROXY_ADDRESS_FORWARDING: 'true'

确保CT-Keycloak-am Container中的DB_XXX参数值匹配mysql。

4.配置MySQL驱动程序和模块

这已经由build-keycloak.sh完成,该脚本将mysql驱动程序和模块文件复制到docker容器内的提取的keycloak服务器。

这是我们的MySQL模块文件。

<?xml version="1.0" encoding="UTF-8"?>
<module
    xmlns="urn:jboss:module:1.0" name="com.mysql.jdbc">
  <resources>
    <resource-root path="mysql-connector-java-8.0.29.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

5.在KeyCloak中添加MySQL数据源和驱动程序配置

这是由set-database.cli脚本来处理的,该脚本通过使用来自数据库URL,用户名,密码和JDBC参数等环境变量的值来安装数据源和驱动程序配置。

/subsystem=datasources/data-source=KeycloakDS: remove()
/subsystem=datasources/data-source=KeycloakDS: add(jndi-name=java:jboss/datasources/KeycloakDS,enabled=true,use-java-context=true,use-ccm=true, connection-url=jdbc:mysql://${env.DB_ADDR:mysql}:${env.DB_PORT:3306}/${env.DB_DATABASE:keycloak}${env.DB_JDBC_PARAMS:}, driver-name=mysql)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=user-name, value=${env.DB_USER:keycloak})
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=password, value=${env.DB_PASSWORD:password})
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=check-valid-connection-sql, value="SELECT 1")
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=background-validation, value=true)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=background-validation-millis, value=60000)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=flush-strategy, value=IdleConnections)
/subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql, driver-module-name=com.mysql.jdbc,driver-xa-datasource-class-name=com.mysql.cj.jdbc.MysqlXADataSource)

6.运行项目

如果您熟悉Docker-Compose,您知道这是我们的定制KeyCloak服务器的入口点。

在运行它之前,请评论导入SPI的行,或成为GitHub的赞助商,以便您可以访问那些受限制的项目。

docker-compose -f ./keycloak-docker-assembly/docker/docker-compose-dev.yml up --build