将 Java Tomcat 应用部署到Azure App 服务
本文介绍如何将具有 Microsoft Entra 帐户登录的 Tomcat 应用部署到Azure App 服务。
本文假定你仅使用“ 本地 运行”选项卡完成了以下文章之一,现在想要部署到 Azure。 这些说明与以下文章中的 “部署到 Azure ”选项卡中的说明相同:
- 使用 Microsoft Entra ID 为 Java Tomcat 应用启用登录
- 在 Azure Active Directory B2C 中使用 MSAL4J 为 Java Tomcat 应用启用登录
- 启用 Java Tomcat 应用以登录用户并访问 Microsoft Graph
- 使用角色和角色声明保护 Java Tomcat 应用
- 使用组和组声明保护 Java Tomcat 应用
先决条件
-
如果 Maven 不是首选开发工具,请参阅以下使用其他工具的类似教程:
配置 Maven 插件
部署到Azure App 服务时,部署会自动使用 Azure CLI 中的 Azure 凭据。 如果未在本地安装 Azure CLI,则 Maven 插件会使用 OAuth 或设备登录来进行身份验证。 有关详细信息,请参阅 Maven 插件的身份验证。
使用以下步骤配置插件:
运行以下命令来配置部署。 此命令可帮助你设置Azure App 服务操作系统、Java 版本和 Tomcat 版本。
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config
对于 “创建新的运行配置”,请按 Y,然后按 Enter。
对于 OS 的“定义”值,请按 1 for Windows 或 2 for Linux,然后按 Enter。
对于 javaVersion 的定义值,请按 2 for Java 11,然后按 Enter。
对于 WebContainer 的“定义”值,请按 Tomcat 9.0 的 4 ,然后按 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 App 服务中运行。
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中修改App 服务的配置。 下表列出了一些常见配置:
properties | 必选 | 说明 |
---|---|---|
subscriptionId |
false | 订阅的 ID。 |
resourceGroup |
是 | 应用的 Azure 资源组。 |
appName |
是 | 应用的名称。 |
region |
false | 托管应用的区域。 默认值为 centralus 。 有关有效区域,请参阅 支持的区域。 |
pricingTier |
false | 应用的定价层。 默认值为 P1v2 生产工作负荷。 Java 开发和测试的建议最小值是 B2 。 有关详细信息,请参阅App 服务定价。 |
runtime |
false | 运行时环境配置。 有关详细信息,请参阅配置详细信息。 |
deployment |
false | 部署配置。 有关详细信息,请参阅配置详细信息。 |
有关配置的完整列表,请参阅插件参考文档。 所有 Azure Maven 插件共享一组常见的配置。 有关这些配置,请参阅 常见配置。 有关特定于Azure App 服务的配置,请参阅 Azure 应用:配置详细信息。
请务必保存保留这些 appName
值, resourceGroup
供以后使用。
准备应用进行部署
将应用程序部署到App 服务时,重定向 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 App 服务,因此还需要更改 Microsoft Entra ID 应用注册中的重定向 URI。 若要进行此更改,请使用以下步骤:
导航到面向开发人员的 Microsoft 标识平台应用注册页。
使用搜索框搜索应用注册 ,例如
java-servlet-webapp-authentication
。通过选择应用名称打开应用注册。
从菜单中选择“身份验证”。
在“Web - 重定向 URI”部分中,选择“添加 URI”。
填写应用的 URI,追加
/auth/redirect
- 例如。https://<your-app-name>.azurewebsites.net/auth/redirect
选择“保存”。
部署应用
现在可以将应用部署到Azure App 服务。 使用以下命令确保登录到 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 密钥库中,并使用密钥库引用在应用程序中可用。
使用以下步骤将值aad.secret
移动到密钥库并在代码中使用:
使用以下命令创建 Azure 密钥库 实例:
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
部署现已完成。