你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用托管标识从 Java Tomcat 应用服务连接到 PostgreSQL 数据库,而无需使用机密
Azure 应用服务在 Azure 中提供高度可缩放、自修补的 Web 托管服务。 它还为应用提供托管标识,这是一项统包解决方案,可以确保安全地访问 Azure Database for PostgreSQL 和其他 Azure 服务。 应用服务中的托管标识可以让应用更安全,因为不需在应用中存储机密,例如环境变量中的凭据。 本教程介绍如何执行下列操作:
- 创建 PostgreSQL 数据库。
- 使用 WAR 打包将示例应用部署到 Tomcat 上的 Azure 应用服务。
- 将 Tomcat Web 应用程序配置为结合使用 Microsoft Entra 身份验证与 PostgreSQL 数据库。
- 使用服务连接器连接到具有托管标识的 PostgreSQL 数据库。
如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户。
先决条件
克隆示例应用并准备存储库
在终端中运行以下命令,以克隆示例存储库并设置示例应用环境。
git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/Tomcat/
创建用于 PostgreSQL 的 Azure 数据库
按照以下步骤在订阅中创建 Azure Database for Postgres。 Tomcat 应用会在运行时连接到此数据库并存储自身的数据,以便无论你在何处运行应用程序,它都会保存应用程序状态。
登录到 Azure CLI,(可选)如果有多个订阅连接到登录凭据,请设置订阅。
az login az account set --subscription <subscription-ID>
创建 Azure 资源组并记下资源组名称。
export RESOURCE_GROUP=<resource-group-name> export LOCATION=eastus az group create --name $RESOURCE_GROUP --location $LOCATION
创建 Azure Database for PostgreSQL 服务器。 该服务器是使用管理员帐户创建的,但它不会被使用,因为我们将使用 Microsoft Entra 管理员帐户来执行管理任务。
export POSTGRESQL_ADMIN_USER=azureuser # PostgreSQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database. export POSTGRESQL_ADMIN_PASSWORD=<admin-password> export POSTGRESQL_HOST=<postgresql-host-name> # Create a PostgreSQL server. az postgres flexible-server create \ --resource-group $RESOURCE_GROUP \ --name $POSTGRESQL_HOST \ --location $LOCATION \ --admin-user $POSTGRESQL_ADMIN_USER \ --admin-password $POSTGRESQL_ADMIN_PASSWORD \ --public-access 0.0.0.0 \ --sku-name Standard_D2s_v3
创建应用程序的数据库。
export DATABASE_NAME=checklist az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $POSTGRESQL_HOST \ --database-name $DATABASE_NAME
将应用程序部署到应用服务
按照以下步骤生成 WAR 文件,并使用 WAR 打包部署到 Tomcat 上的 Azure 应用服务。
示例应用包含可生成 WAR 文件的 pom.xml 文件。 运行以下命令以生成应用。
mvn clean package -f pom.xml
使用 Tomcat 9.0 在 Linux 上创建 Azure 应用服务资源。
export APPSERVICE_PLAN=<app-service-plan> export APPSERVICE_NAME=<app-service-name> # Create an App Service plan az appservice plan create \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_PLAN \ --location $LOCATION \ --sku B1 \ --is-linux # Create an App Service resource. az webapp create \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --plan $APPSERVICE_PLAN \ --runtime "TOMCAT:10.0-java11"
将 WAR 包部署到应用服务。
az webapp deploy \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --src-path target/app.war \ --type war
使用标识连接性连接 Postgres 数据库
接下来,使用服务连接器连接数据库。
为 Azure CLI 安装服务连接器无密码扩展:
az extension add --name serviceconnector-passwordless --upgrade
接下来,使用服务连接器将应用连接到具有系统分配的托管标识的 Postgres 数据库。
要进行此连接,请运行 az webapp connection create 命令。
az webapp connection create postgres-flexible \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--target-resource-group $RESOURCE_GROUP \
--server $POSTGRESQL_HOST \
--database $DATABASE_NAME \
--system-identity \
--client-type java
此命令在 Web 应用与 PostgreSQL 服务器之间创建连接,并通过系统分配的托管标识管理身份验证。
接下来,更新应用设置并在连接字符串中添加插件
export AZURE_POSTGRESQL_CONNECTIONSTRING=$(\
az webapp config appsettings list \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
| jq -c -r '.[] \
| select ( .name == "AZURE_POSTGRESQL_CONNECTIONSTRING" ) \
| .value')
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--settings 'CATALINA_OPTS=-DdbUrl="'"${AZURE_POSTGRESQL_CONNECTIONSTRING}"'&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin"'
测试示例 Web 应用
运行以下命令测试应用程序。
export WEBAPP_URL=$(az webapp show \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--query defaultHostName \
--output tsv)
# Create a list
curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}/checklist
# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item
# Get all lists
curl https://${WEBAPP_URL}/checklist
# Get list 1
curl https://${WEBAPP_URL}/checklist/1
清理资源
在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:
az group delete --name myResourceGroup
此命令可能需要花费一点时间运行。
后续步骤
在开发人员指南中详细了解在 Linux 上的应用服务中运行 Java 应用。
了解如何使用自定义域和证书保护应用。