在 Red Hat JBoss EAP 上为 Java 应用配置无密码数据库连接

本文介绍如何使用 Azure 门户为 Red Hat JBoss EAP 产品/服务上的 Java 应用配置无密码数据库连接。

在本指南中,你将完成以下任务:

  • 使用 Azure CLI 预配数据库资源。
  • 在数据库中启用 Microsoft Entra 管理员。
  • 预配用户分配的托管标识,并为其创建数据库用户。
  • 使用 Azure 门户在 Red Hat JBoss EAP 产品/服务中配置无密码数据库连接。
  • 验证数据库连接。

产品/服务支持 Azure Database for PostgreSQL 和 Azure SQL 数据库的无密码连接。

先决条件

为部署选择一个区域

选择具有所需数据库的可用 SKU 的区域。 以下 Azure CLI 命令列出了给定区域中可用的 SKU。 继续尝试不同的区域,直到找到有一些结果的区域。

az mysql flexible-server list-skus --location "$REGION" --output table

创建资源组

使用 az group create 创建资源组。 由于资源组在订阅中必须是唯一的,因此请选择一个唯一名称。 拥有唯一名称的一种简单方法是使用首字母缩写、今天的日期和一些标识符的组合,例如 abc1228rg。 此示例在 abc1228rg 位置创建一个名为 eastus 的资源组:

export RESOURCE_GROUP_NAME="abc1228rg"
export REGION=eastus
az group create \
    --name ${RESOURCE_GROUP_NAME} \
    --location ${REGION}

创建数据库服务器和数据库

使用 az mysql flexible-server create 命令创建灵活服务器。 此示例使用管理员用户 mysql20221201 和管理员密码 azureuser 创建一个名为 Secret123456 的灵活服务器。 将密码替换为你的。 有关详细信息,请参阅使用 Azure CLI 创建 Azure Database for MySQL 灵活服务器

export MYSQL_NAME="mysql20221201"
export MYSQL_ADMIN_USER="azureuser"
export MYSQL_ADMIN_PASSWORD="Secret123456"

az mysql flexible-server create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $MYSQL_NAME \
    --location ${REGION} \
    --admin-user $MYSQL_ADMIN_USER \
    --admin-password $MYSQL_ADMIN_PASSWORD \
    --public-access 0.0.0.0 \
    --tier Burstable \
    --sku-name Standard_B1ms

使用 az mysql flexible-server db create 创建一个数据库。

export DATABASE_NAME="contoso"

# create mysql database
az mysql flexible-server db create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server-name $MYSQL_NAME \
    --database-name $DATABASE_NAME

当命令成功完成时,你将看到类似于以下示例的输出:

Creating database with utf8 charset and utf8_general_ci collation
{
  "charset": "utf8",
  "collation": "utf8_general_ci",
  "id": "/subscriptions/contoso-hashcode/resourceGroups/abc1228rg/providers/Microsoft.DBforMySQL/flexibleServers/mysql20221201/databases/contoso",
  "name": "contoso",
  "resourceGroup": "abc1228rg",
  "systemData": null,
  "type": "Microsoft.DBforMySQL/flexibleServers/databases"
}

为数据库配置 Microsoft Entra 管理员

现在创建了数据库,你就需要使其支持无密码连接。 无需密码的连接需要 Azure 资源的托管标识和 Microsoft Entra 身份验证的组合。 有关 Azure 资源的托管标识的概述,请参阅什么是 Azure 资源的托管标识?

有关 MySQL 灵活服务器如何与托管标识交互的信息,请参阅 Azure Database for MySQL 文档

以下示例将当前 Azure CLI 用户配置为 Microsoft Entra 管理员帐户。 若要启用 Azure 身份验证,必须为 MySQL 灵活服务器分配一个标识。

首先,使用 az identity create 创建一个托管标识,然后使用 az mysql flexible-server identity assign 将该标识分配给 MySQL 服务器。

export MYSQL_UMI_NAME="id-mysql-aad-20221205"

# create a User Assigned Managed Identity for MySQL to be used for AAD authentication
az identity create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $MYSQL_UMI_NAME

## assign the identity to the MySQL server
az mysql flexible-server identity assign \
    --resource-group $RESOURCE_GROUP_NAME \
    --server-name $MYSQL_NAME \
    --identity $MYSQL_UMI_NAME

然后,使用 az mysql flexible-server ad-admin create 将当前 Azure CLI 用户设置为 Microsoft Entra 管理员帐户。

export CURRENT_USER=$(az account show --query user.name --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)

az mysql flexible-server ad-admin create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server-name $MYSQL_NAME \
    --object-id $CURRENT_USER_OBJECTID \
    --display-name $CURRENT_USER \
    --identity $MYSQL_UMI_NAME

创建用户分配的托管标识

接下来,在 Azure CLI 中使用 az identity create 命令在订阅中创建一个标识。 您可以使用这种托管身份连接到您的数据库。

az identity create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name myManagedIdentity

若要在以下步骤中配置标识,请使用 az identity show 命令将标识的客户端 ID 存储在 shell 变量中。

# Get client ID of the user-assigned identity
export CLIENT_ID=$(az identity show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name myManagedIdentity \
    --query clientId \
    --output tsv)

为托管标识创建数据库用户

首先,需要创建防火墙规则才能从 CLI 客户端访问数据库服务器。 运行以下命令,以获取当前的 IP 地址:

export MY_IP=$(curl http://whatismyip.akamai.com)

如果使用的是启用了 VPN 的适用于 Linux 的 Windows 子系统 (WSL),则以下命令可能会返回错误的 IPv4 地址。 获取 IPv4 地址的一种方法是访问 whatismyipaddress.com。 将环境变量 MY_IP 设置为要从中连接到数据库的 IPv4 地址。 稍后请使用此 IP 地址配置数据库防火墙。

以 Microsoft Entra 管理员用户身份连接到 MySQL 数据库,并为托管标识创建 MySQL 用户。

使用 az mysql flexible-server firewall-rule create创建一个临时防火墙规则。

az mysql flexible-server firewall-rule create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $MYSQL_NAME \
    --rule-name AllowCurrentMachineToConnect \
    --start-ip-address ${MY_IP} \
    --end-ip-address ${MY_IP}

接下来,准备一个 SQL 文件,为托管标识创建一个数据库用户。 以下示例添加了一个登录名为 identity-contoso 的用户,并授予该用户访问数据库 contoso 的权限:

export IDENTITY_LOGIN_NAME="identity-contoso"

cat <<EOF >createuser.sql
SET aad_auth_validate_oids_in_tenant = OFF;
DROP USER IF EXISTS '${IDENTITY_LOGIN_NAME}'@'%';
CREATE AADUSER '${IDENTITY_LOGIN_NAME}' IDENTIFIED BY '${CLIENT_ID}';
GRANT ALL PRIVILEGES ON ${DATABASE_NAME}.* TO '${IDENTITY_LOGIN_NAME}'@'%';
FLUSH privileges;
EOF

使用命令 az mysql flexible-server execute 执行 SQL 文件。 可以使用 az account get-access-token 命令获取访问令牌。

export RDBMS_ACCESS_TOKEN=$(az account get-access-token \
    --resource-type oss-rdbms \
    --query accessToken \
    --output tsv) 

az mysql flexible-server execute \
    --name ${MYSQL_NAME} \
    --admin-user ${CURRENT_USER} \
    --admin-password ${RDBMS_ACCESS_TOKEN} \
    --file-path "createuser.sql"

可能会提示你安装 rdbms-connect 扩展,如以下输出所示。 按 y 以继续操作。 如果不是与 root 用户一起工作,则需要输入该用户的密码。

The command requires the extension rdbms-connect. Do you want to install it now? The command will continue to run after the extension is installed. (Y/n): y
Run 'az config set extension.use_dynamic_install=yes_without_prompt' to allow installing extensions without prompt.
This extension depends on gcc, libpq-dev, python3-dev and they will be installed first.
[sudo] password for user:

如果 SQL 文件执行成功,输出结果将与下例类似:

Running *.sql* file 'createuser.sql'...
Successfully executed the file.
Closed the connection to mysql20221201

使用用户名 myManagedIdentity 进行身份验证时,托管标识 identity-contoso 现在有权访问数据库。

如果不想再从该 IP 地址访问服务器,可以使用以下命令删除防火墙规则:

az mysql flexible-server firewall-rule delete \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $MYSQL_NAME \
    --rule-name AllowCurrentMachineToConnect \
    --yes

最后,使用以下命令获取下一节中使用的连接字符串:

export CONNECTION_STRING="jdbc:mysql://${MYSQL_NAME}.mysql.database.azure.com:3306/${DATABASE_NAME}?useSSL=true"
echo ${CONNECTION_STRING}

为 Azure VM 上的 Red Hat JBoss EAP 配置无密码数据库连接

在继续之前,请确保用于登录和完成本文的 Azure 标识在当前订阅中具有 “所有者 ”角色或当前订阅中的 “参与者 ”和 “用户访问管理员 ”角色。 有关 Azure 角色的概述,请参阅 什么是 Azure 基于角色的访问控制(Azure RBAC)? 有关 Red Hat JBoss EAP 市场产品/服务所需的特定角色的详细信息,请参阅 Azure 内置角色

本部分介绍如何使用适用于 Red Hat JBoss EAP 的 Azure 市场产品/服务配置无密码数据源连接。

首先,开始部署产品/服务的过程。 以下产品/服务支持无密码数据库连接:

如果要启用这些功能,请输入“基本信息”窗格和其他窗格中所需的信息。 到达数据库窗格时,请按照以下步骤输入无密码配置:

  1. 对于连接到数据库?,请选择
  2. “连接设置”下,对于“选择数据库类型”,打开下拉菜单,然后选择“Azure SQL”(支持无密码连接)。
  3. 对于 JNDI 名称,输入 testpasswordless 或预期值。
  4. 对于数据源连接字符串,输入在上一节中获取的连接字符串。
  5. 选择使用无密码数据源连接
  6. 对于用户分配的托管标识,选择在上一步中创建的托管标识。 在本例中,其名称为 myManagedIdentity
  7. 选择 并添加

“连接设置”部分应类似以下屏幕截图所示:

Azure 门户的屏幕截图,其中显示了“选择数据库类型”页。

验证数据库连接

如果产品/服务部署无错误地完成,则数据库连接配置成功。

部署完成后,请按照 Azure 门户中的步骤查找管理控制台 URL。

  1. 查找在其中部署 JBoss EAP 的资源组。
  2. 设置中,选择部署
  3. 选择持续时间最长的部署。 此部署应位于列表底部。
  4. 选择“输出”。
  5. 管理控制台的 URL 是 adminConsole 输出的值。
  6. 复制输出变量 adminConsole 的值。
  7. 将该值粘贴到浏览器地址栏中,然后按 Enter 打开集成解决方案控制台的登录页。

使用以下步骤验证数据库连接:

  1. 使用“ 基本信息 ”窗格中提供的用户名和密码登录到管理控制台。

    管理控制台登录屏幕的屏幕截图。

  2. 登录后,从主菜单中选择 “配置 ”。

  3. 在列浏览器中,选择子系统数据源和驱动程序数据源dataSource-mssqlserver

  4. 在下拉菜单中,选择“测试连接

  5. 你应该会看到一条消息,显示的内容类似于 Successfully tested connection for data source dataSource-mssqlserver.

以下屏幕截图突出显示了相关的用户界面元素:

显示测试数据库页的管理控制台的屏幕截图。

清理资源

如果不需要这些资源,可以使用以下命令将它们删除:

az group delete --name ${RESOURCE_GROUP_NAME}
az group delete --name <resource-group-name-that-deploys-the-offer>

后续步骤

通过以下链接详细了解如何在 Azure RedHat OpenShift 和虚拟机上运行 JBoss EAP: