将 Java Tomcat 应用部署到 Azure 应用服务
本文介绍如何将使用 Microsoft Entra 帐户登录的 Tomcat 应用部署到 Azure 应用服务。
本文假定只使用“本地运行”选项卡完成了以下文章之一,并且现在想要部署到 Azure。 这些说明与以下文章中的“部署到 Azure”选项卡中的说明相同:
- 使用 Microsoft Entra ID 为 Java Tomcat 应用启用登录
- 使用 MSAL4J 在 Azure Active Directory B2C 中为 Java Tomcat 应用启用登录功能
- 启用 Java Tomcat 应用以登录用户并访问 Microsoft Graph
- 使用角色和角色声明保护 Java Tomcat 应用
- 使用组和组声明保护 Java Tomcat 应用
先决条件
适用于 Azure 应用服务应用的 Maven 插件
如果 Maven 不是首选开发工具,请参阅以下使用其他工具的类似教程:
配置 Maven 插件
当您部署到 Azure 应用服务时,系统会自动使用 Azure CLI 中的 Azure 凭据。 如果未在本地安装 Azure CLI,则 Maven 插件使用 OAuth 或设备登录进行身份验证。 有关详细信息,请参阅 Maven 插件的身份验证。
使用以下步骤配置插件:
运行以下命令来配置部署。 此命令可帮助你设置 Azure 应用服务操作系统、Java 版本和 Tomcat 版本。
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
在“创建新的运行配置”中,按“Y”,然后按 Enter。
在“定义 OS 的值”中,请按“1”表示 Windows,或者按“2”表示 Linux,然后按 Enter。
在“定义 javaVersion 的值”中,按“2”表示 Java 11,然后按 Enter。
在“定义 WebContainer 的值”中,按“4”表示 Tomcat 9.0,然后按 Enter。
在“定义 pricingTier 的值”中,按 Enter 以选择默认的 P1v2 层。
在“确认”中,请按“Y”,然后按 Enter。
以下示例显示了部署过程的输出:
Please confirm webapp properties
AppName : msal4j-servlet-auth-1707209552268
ResourceGroup : msal4j-servlet-auth-1707209552268-rg
Region : centralus
PricingTier : P1v2
OS : Linux
Java Version: Java 11
Web server stack: Tomcat 9.0
Deploy to slot : false
Confirm (Y/N) [Y]: [INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.112 s
[INFO] Finished at: 2024-02-06T08:53:02Z
[INFO] ------------------------------------------------------------------------
确认选择后,该插件会将所需的插件元素和设置添加到项目的 pom.xml 文件中,以将应用配置为在 Azure 应用服务中运行。
pom.xml 文件的相关部分应类似于以下示例:
<build>
<plugins>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>>azure-webapp-maven-plugin</artifactId>
<version>x.xx.x</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<resourceGroup>your-resourcegroup-name</resourceGroup>
<appName>your-app-name</appName>
...
</configuration>
</plugin>
</plugins>
</build>
您可以直接在 pom.xml中修改应用服务的配置。 下表列出了一些常见配置:
财产 | 必须 | 描述 |
---|---|---|
subscriptionId |
false | 订阅的 ID。 |
resourceGroup |
true | 您应用程序的 Azure 资源组。 |
appName |
true | 应用的名称。 |
region |
false | 托管应用的区域。 默认值为 centralus 。 有关有效区域的信息,请参阅 支持区域。 |
pricingTier |
false | 应用的定价层。 生产工作负荷的默认值为 P1v2 。 建议的 Java 开发和测试最小值是 B2 。 有关详细信息,请参阅 应用服务定价。 |
runtime |
false | 运行时环境配置。 有关详细信息,请参阅 配置详细信息。 |
deployment |
false | 部署配置。 有关详细信息,请参阅 配置详细信息。 |
有关配置的完整列表,请参阅插件参考文档。 所有 Azure Maven 插件共享一组常见的配置。 有关这些配置,请参阅 常见配置。 有关特定于 Azure 应用服务的配置,请参阅 Azure 应用:配置详细信息。
请务必将 appName
和 resourceGroup
值保存到以后使用。
准备应用进行部署
将应用程序部署到应用服务时,重定向 URL 将更改为已部署的应用实例的重定向 URL。 使用以下步骤更改属性文件中的这些设置:
导航到应用的 authentication.properties 文件,并将
app.homePage
的值更改为已部署应用的域名,如以下示例所示。 例如,如果在上一步中选择example-domain
作为应用名称,那么现在必须使用https://example-domain.azurewebsites.net
作为app.homePage
值。 请确保已将协议从http
更改为https
。# app.homePage is by default set to dev server address and app context path on the server # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net app.homePage=https://<your-app-name>.azurewebsites.net
保存此文件后,使用以下命令重新生成应用:
mvn clean package
更新您的 Microsoft Entra ID 应用注册
由于重定向 URI 会更改为在 Azure 应用程序服务上部署的应用,因此还需要更改 Microsoft Entra ID 应用注册中的重定向 URI。 使用以下步骤进行此更改:
导航到面向开发人员的 Microsoft 标识平台应用注册页。
使用搜索框搜索应用注册,例如
java-servlet-webapp-authentication
。通过选择应用名称打开应用注册。
从菜单中选择“身份验证”。
在“Web - 重定向 URI”部分中,选择“添加 URI”。
填写应用的 URI,追加
/auth/redirect
,例如https://<your-app-name>.azurewebsites.net/auth/redirect
。选择 保存。
部署应用
现在可以将应用部署到 Azure 应用服务。 使用以下命令确保登录到 Azure 环境以执行部署:
az login
在 pom.xml 文件中准备好所有配置后,现在可以使用以下命令将 Java 应用部署到 Azure:
mvn package azure-webapp:deploy
部署完成后,应用程序在 http://<your-app-name>.azurewebsites.net/
准备就绪。 使用本地 Web 浏览器打开 URL,此时应会看到 msal4j-servlet-auth
应用程序的起始页。
删除机密值
应用程序的 authentication.properties 文件当前在 aad.secret
参数中保存客户端机密的值。 在此文件中保留此值并非良好做法。 如果将其提交到 Git 存储库,则也可能面临风险。
作为安全额外步骤,可以将此值存储在 azure Key Vault 中,并使用 Key Vault 引用 使其在应用程序中可用。
使用以下步骤将 aad.secret
的值移动到 Key Vault 并在代码中使用:
使用以下命令创建 Azure Key Vault 实例:
export RESOURCE_GROUP=<your-resource-group-name> export KEY_VAULT=<your-key-vault-name> az keyvault create \ --resource-group $RESOURCE_GROUP \ --name $KEY_VAULT
使用以下命令将
aad.secret
机密值作为新机密添加到密钥保管库:az keyvault secret set \ --vault-name $KEY_VAULT \ --name "AADSECRET" \ --value "<the-value-of-your-client-secret>"
现在,需要授予应用对密钥保管库的访问权限。 若要执行此任务,请先使用以下命令为应用创建新的标识:
export WEB_APP_NAME=<your-web-app-name> az webapp identity assign \ --resource-group $RESOURCE_GROUP \ --name $WEB_APP_NAME
使用以下命令为此标识提供对密钥保管库中的机密的
get
和list
权限:export IDENTITY=$(az webapp identity show \ --resource-group $RESOURCE_GROUP \ --name $WEB_APP_NAME \ --query principalId \ --output tsv) az keyvault set-policy \ --resource-group $RESOURCE_GROUP \ --name $KEY_VAULT \ --secret-permissions get list \ --object-id $IDENTITY
使用以下命令在应用中创建应用程序设置,该设置使用对密钥保管库中的机密的密钥保管库引用。 此设置将机密的值作为环境变量提供给应用。
az webapp config appsettings set \ --resource-group $RESOURCE_GROUP \ --name $WEB_APP_NAME \ --settings AADSECRET='@Microsoft.KeyVault(VaultName=$KEY_VAULT;SecretName=AADSECRET)'
使用以下代码从环境变量加载此值。 在 \src\main\java\com\microsoft\azuresamples\msal4j\helpers\Config.java 文件中,第 41 行将当前语句更改为以下行:
public static final String SECRET = System.getenv("AADSECRET");
现在可以从 authentication.properties 文件中删除
aad.secret
密钥和值。使用以下命令重新生成代码:
mvn clean package
使用以下命令重新部署应用程序:
mvn package azure-webapp:deploy
部署现已完成。
详细信息
- 适用于 Java 的
Microsoft 身份验证库 (MSAL) - Microsoft 身份平台(面向开发人员的 Microsoft Entra ID)
- 快速入门:将应用程序注册到Microsoft标识平台
- 了解 Microsoft Entra ID 应用程序同意体验
- 了解用户和管理员同意
- MSAL 代码示例