本文档仅适用于Spring Cloud Azure:4.4.1。请参阅Spring 版本映射以获取有关受支持版本的更多信息。

© 2016-2022 原作者。

Spring Cloud Azure 参考文档_spring

本文档的副本可以制作供您自己使用和分发给他人,前提是您不对此类副本收取任何费用,并且每个副本都包含本版权声明,无论是以印刷形式还是以电子方式分发。

Spring 是由 VMware 开发的开源应用程序框架,它提供了一种简化的模块化方法来创建 Java 应用程序。Spring Cloud Azure 是一个开源项目,提供与 Azure 服务的无缝 Spring 集成。

1. 获得帮助

如果您对本文档有任何疑问,请通过创建 GitHub 问题来提问。欢迎拉取请求。

Table 1. GitHub repositories

GitHub 存储库

描述

Azure/azure-sdk-for-java

此存储库用于保存源代码。

微软/Spring-Cloud-Azure

此存储库用于保存当前页面中显示的文档。

2. 自 4.0.x 以来 3.10 中的新功能

本页介绍自 3.10 以来在 4.0 中所做的更改。通过此主要版本,我们的目标是带来更好的安全性、更精简的依赖项、对生产就绪性的支持等。

要了解如何迁移到 4.0,请查看附录页面。

以下列表总结了Spring Cloud Azure 4.0提供的一些更改:

  • 统一的开发体验,具有统一的项目名称、项目 ID 和属性。
  • 使用单个 BOM 简化依赖项管理。spring-cloud-azure-dependencies
  • 扩展了Spring Initializr上的 Azure 支持,以涵盖 Kafka、Event Hubs、Azure Cache for Redis 和 Azure App Configuration。
  • 重新构建了 Spring 模块依赖项,以消除多余的层和纠缠。
  • Azure 应用程序配置、事件中心、服务总线、Cosmos DB、密钥保管库、存储 Blob 和存储队列的托管标识支持。
  • 继续支持春季库中基础 Azure SDK 中的身份验证方法,例如使用服务总线和事件中心的 SAS 令牌和令牌凭据身份验证。
  • 凭据链现在默认处于启用状态,使应用程序能够从应用程序属性、环境变量、托管标识、IDE 等获取凭据。
  • 资源级别(例如服务总线队列)的精细访问控制,以实现更好的安全治理和遵守 IT 策略。
  • 通过显著改进同步和异步方案的 Azure SDK 客户端的自动配置覆盖率,以 Spring 惯用方式公开更多选项。
  • 添加了 Azure 应用程序配置、事件中心、Cosmos DB、密钥保管库、存储 Blob、存储队列和存储文件的运行状况指示器。
  • Spring Cloud Sleuth 支持所有基于 HTTP 的 Azure SDK。

3. 4.0 迁移指南

要了解如何迁移到 4.0,请查看附录页面。

​4. 入门​

​4.1. 设置依赖​

​4.1.1. 物料清单​

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-dependencies</artifactId>
<version>4.4.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

​4.1.2. 启动器依赖项​

Spring Cloud Azure Starters 是一组方便的依赖项描述符,可包含在应用程序中。每个启动器都包含开始使用其相应的Spring Cloud Azure模块所需的所有依赖项和传递依赖项。它们通过 Azure 服务促进 Spring 启动应用程序开发。

例如,如果要开始使用 Azure Cosmos DB 进行数据持久性,请在项目中包括依赖项。​​spring-cloud-azure-starter-cosmos​

Spring Cloud Azure在组下提供以下启动器:​​com.azure.spring​

Table 2. Spring Cloud Azure starters

名字

描述

春天-云-蔚蓝-启动器

核心启动器,包括自动配置支持

spring-cloud-azure-starter-active-directory

将 Azure Active Directory 与 Spring Security 结合使用的入门

spring-cloud-azure-starter-active-directory-b2c

将 Azure Active Directory B2C 与 Spring Security 结合使用的入门

spring-cloud-azure-starter-appconfiguration

用于使用 Azure 应用程序配置的初学者

春天-云-蔚蓝-启动器-宇宙

用于使用 Azure Cosmos DB 的初学者

春季-云-Azure-启动器-事件中心

用于使用 Azure 事件中心的初学者

弹簧-云-Azure-启动器-密钥库

使用 Azure 密钥保管库的初学者

spring-cloud-azure-starter-keyvault-certificates

使用 Azure 密钥保管库证书的初学者

弹簧-云-Azure-启动器-密钥保管库-机密

使用 Azure 密钥保管库机密的初学者

弹簧-云-Azure-启动器-服务总线

用于使用 Azure 服务总线的初学者

spring-cloud-azure-starter-servicebus-jms

使用 Azure 服务总线和 JMS 的入门工具

弹簧-云-Azure-启动器-存储

使用 Azure 存储的入门

spring-cloud-azure-starter-storage-blob

用于使用 Azure Storage Blob 的入门

弹簧-云-Azure-启动器-存储-文件共享

使用 Azure 存储文件共享的入门程序

弹簧-云-Azure-启动器-存储-队列

使用 Azure 存储队列的入门程序

弹簧-云-蔚蓝-启动器-执行器

用于使用弹簧靴执行器的启动器,该执行器提供生产就绪功能

以下是Spring Data支持的入门:

Table 3. Spring Data related starters

名字

描述

春天-云-Azure-启动器-数据-宇宙

用于使用 Azure Cosmos DB 和 Spring Data Cosmos DB 的入门程序

以下是Spring 集成支持的入门工具:

Table 4. Spring Integration related starters

名字

描述

春季-云-Azure-启动器-集成-事件中心

使用 Azure 事件中心和春季集成的入门工具

弹簧-云-Azure-启动器-集成-服务总线

使用 Azure 服务总线和 Spring 集成的入门工具

春天-云-Azure-启动器-集成-存储-队列

使用 Azure 存储队列和 Spring 集成的入门工具

以下是Spring Cloud Stream支持的入门工具:

Table 5. Spring Cloud Stream related starters

名字

描述

spring-cloud-azure-starter-stream-eventhubs

使用 Azure 事件中心和 Spring 云流绑定程序的初学者

弹簧-云-Azure-启动器-流-服务总线

用于使用 Azure 服务总线和 Spring 云流绑定程序的初学者

4.2. 学习春天云 Azure

我们准备了完整的示例列表来显示用法,可以在Spring Cloud Azure示例中找到。

5. 配置

大多数 Azure SDK 可以按传输类型分为两类:基于 HTTP 和基于 AMQP。存在所有 SDK 通用的属性,例如身份验证主体和 Azure 环境设置。或基于 HTTP 的客户端通用,例如用于记录 HTTP 请求和响应的日志记录级别。Spring Cloud Azure 4.0 提供了五种常见类别的配置属性,可以为每个 Azure 服务指定这些属性。

Table 6. Service common properties

财产

描述

春天.云.蔚蓝.<azure-service>.client

在一个 Azure 服务 SDK 下配置传输客户端。

春天.云.蔚蓝.<azure-service>.credential

配置如何使用一个 Azure 服务 SDK 的 Azure Active Directory 进行身份验证。

春天.云.蔚蓝.<azure-service>.profile

为一个 Azure 服务 SDK 配置 Azure 云环境。

春天.云.蔚蓝.<azure-service>.proxy

为一个 Azure 服务 SDK 配置代理选项。

春天.云.蔚蓝.<azure-service>.retry

若要配置重试选项,请应用于一个 Azure 服务 SDK。重试选项支持部分 SDK,但没有。​​spring.cloud.azure.cosmos.retry​

可以在不同的 Azure 服务之间共享一些属性,例如,使用相同的服务主体访问 Azure Cosmos DB 和 Azure 事件中心。Spring Cloud Azure 4.0 允许应用程序开发人员指定适用于带有前缀的所有 Azure SDK 的属性。​​spring.cloud.azure​

Table 7. Global properties

财产

描述

春天.云.蔚蓝.客户

配置传输客户端,默认情况下适用于所有 Azure SDK。

春天.云.蔚蓝.凭据

配置默认情况下如何使用所有 Azure SDK 的 Azure Active Directory 进行身份验证。

春天.云.蔚蓝.轮廓

默认为所有 Azure SDK 配置 Azure 云环境。

春天.云.蔚蓝.代理

若要配置代理选项,请默认应用于所有 Azure SDK 客户端。

春天.云.蔚蓝.重试

若要配置重试选项,请默认应用于所有 Azure SDK 客户端。

在每个 Azure 服务下配置的属性将替代全局配置。

Spring Cloud Azure 将配置属性的前缀统一到 4.0 之后,这将使配置属性更加一致和直观。下面是对服务特定属性的快速回顾。​​spring.cloud.azure​

Table 8. Service specific properties

Azure Service

配置属性前缀

“配置属性”链接

Azure 应用程序配置

春天.云.蔚蓝.应用配置

应用程序配置属性

Azure Cosmos DB

春天.云.蔚蓝.宇宙

宇宙属性

Azure Event Hubs

春天.云.蔚蓝.事件中心

事件中心属性

Azure 密钥保管库证书

春天.云.蔚蓝.密钥保管库.证书

密钥保管库证书属性

Azure 密钥保管库机密

春天.云.蔚蓝.密钥保管库.机密

密钥保管库机密属性

Azure 服务总线

春天.云.蔚蓝.服务总线

服务总线属性

Azure Storage Blob

春天.云.蔚蓝.storage.blob

存储 Blob 属性

Azure 存储文件共享

春天.云.蔚蓝.storage.fileshare

存储文件共享属性

Azure 存储队列

春天.云.蔚蓝.storage.queue

存储队列属性

6. 认证

6.1. 默认Azure凭据

适用于应用程序打算在 Azure 云中运行的大多数方案。这是因为 DefaultAzureCredential 将部署时通常用于进行身份验证的凭据与用于在开发环境中进行身份验证的凭据组合在一起。​​DefaultAzureCredential​

默认Azure 凭据旨在通过处理具有合理默认行为的常见方案来简化 SDK 入门。想要更多控制权或其方案未由默认设置提供的开发人员应使用其他凭据类型。

将尝试按顺序通过以下机制进行身份验证。​​DefaultAzureCredential​

Spring Cloud Azure 参考文档_应用程序_02

  • 环境 - 将读取通过环境变量指定的帐户信息并使用它来进行身份验证。DefaultAzureCredential
  • 托管标识 - 如果将应用程序部署到启用了托管标识的 Azure 主机,则将使用该帐户进行身份验证。DefaultAzureCredential
  • IntelliJ - 如果开发人员已通过适用于 IntelliJ 的 Azure 工具包进行身份验证,则将使用该帐户进行身份验证。DefaultAzureCredential
  • Visual Studio Code - 如果开发人员已通过 Visual Studio Code Azure 帐户插件进行身份验证,则将使用该帐户进行身份验证。DefaultAzureCredential
  • Azure CLI - 如果开发人员已通过 Azure CLI az login 命令对帐户进行身份验证,则将使用该帐户进行身份验证。DefaultAzureCredential

请参阅向 AzureAD 授予访问权限,确保已向安全主体授予访问 Azure 资源的足够权限。

从Spring Cloud Azure AutoConfiguration 4.1.0开始,abean named将默认自动注册,并将管理Azure Identity创建的所有线程。此线程池管理的每个线程的名称都带有前缀。Thisbean独立于Spring Boot提供的thebean。​​ThreadPoolTaskExecutor​​​​springCloudAzureCredentialTaskExecutor​​​​az-identity-​​​​ThreadPoolTaskExecutor​​​​Executor​

​6.2. 托管身份​

开发人员面临的一个共同挑战是管理用于保护构成解决方案的不同组件之间通信的机密和凭据。托管标识使开发人员无需管理凭据。托管标识为应用程序提供在连接到支持 Azure Active Directory (Azure AD) 身份验证的资源时要使用的标识。应用程序可以使用托管标识来获取 Azure AD 令牌。例如,应用程序可以使用托管标识来访问 Azure 密钥保管库等资源,开发人员可以在其中以安全的方式存储凭据或访问存储帐户。

我们建议使用托管标识,而不是在应用程序中使用连接字符串或密钥,因为它更安全,并且省去了管理机密和凭据的麻烦。在这种情况下,可以更好地服务于使用本地存储的帐户信息在本地开发并将应用程序部署到 Azure 云并使用托管标识的方案。​​DefaultAzureCredential​

6.2.1. 托管身份类型

有两种类型的托管标识:

  • 系统分配某些 Azure 服务允许直接在服务实例上启用托管标识。启用系统分配的托管标识时,将在 Azure AD 中创建与该服务实例的生命周期相关联的标识。因此,删除资源时,Azure 会自动删除标识。根据设计,只有该 Azure 资源可以使用此标识从 Azure AD 请求令牌。
  • 用户分配还可以将托管标识创建为独立的 Azure 资源。可以创建用户分配的托管标识,并将其分配给 Azure 服务的一个或多个实例。对于用户分配的托管标识,标识与使用它的资源分开管理。

使用用户分配的托管标识时,可以按或指定客户端 ID。​​spring.cloud.azure.credential.client-id​​​​spring.cloud.azure.<azure-service>.credential.client-id​

请参阅向 AzureAD 授予访问权限,确保已向安全主体授予访问 Azure 资源的足够权限。


请参阅什么是 Azure 资源的托管标识?有关托管标识的更多详细信息。

6.3. 其他凭证类型

想要更多控制权或其方案未由默认设置提供的方案或其方案未提供服务的开发人员应使用其他凭据类型。​​DefaultAzureCredential​

6.3.1. 使用 Azure 活动目录进行身份验证和授权

借助 Azure AD,可以使用 Azure 基于角色的访问控制 (Azure RBAC) 向安全主体(可以是用户或应用程序服务主体)授予权限。当安全主体(用户或应用程序)尝试访问 Azure 资源(例如事件中心资源)时,必须对请求进行授权。使用 Azure AD 时,对资源的访问分为两个步骤。

  1. 首先,对安全主体的标识进行身份验证,并返回 OAuth 2.0 令牌。
  2. 接下来,令牌作为请求的一部分传递给 Azure 服务,以授权访问指定的资源。
使用 Azure Active Directory 进行身份验证

对于想要连接到支持 Azure AD 身份验证的资源的应用程序,可以使用前缀设置以下配置。​​spring.cloud.azure.credential​​​​spring.cloud.azure.<azure-service>.credential​

Table 9. Authentication properties

财产

描述

客户端标识

使用 Azure 执行服务主体身份验证时要使用的客户端 ID。

客户端密钥

使用 Azure 执行服务主体身份验证时要使用的客户端密码。

客户端证书路径

使用 Azure 执行服务主体身份验证时要使用的 PEM 证书文件的路径。

客户端证书密码

证书文件的密码。

用户名

使用 Azure 执行用户名/密码身份验证时要使用的用户名。

密码

使用 Azure 执行用户名/密码身份验证时使用的密码。

已启用托管标识

是否启用托管标识。

要查看所有与Spring Cloud Azure相关的配置属性的列表,请查看附录页面。

应用程序将在多个位置查找可用凭据,如果未配置凭据属性,则使用。如果要使用特定凭据,请参阅以下示例以获取指导。​​DefaultAzureCredential​

以下示例演示如何使用系统分配的托管标识进行身份验证:

spring.cloud.azure:
credential:
managed-identity-enabled: true

以下示例演示如何使用用户分配的托管标识进行身份验证:

spring.cloud.azure:
credential:
managed-identity-enabled: true
client-id: ${AZURE_CLIENT_ID}

以下示例演示如何使用具有客户端密码的服务主体进行身份验证:

spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
profile:
tenant-id: ${AZURE_TENANT_ID}

以下示例演示如何使用具有客户端 PFX 证书的服务主体进行身份验证:

spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CLIENT_CERTIFICATE_PASSWORD}
profile:
tenant-id: ${AZURE_TENANT_ID}

以下示例演示如何使用具有客户端 PEM 证书的服务主体进行身份验证:

spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
profile:
tenant-id: ${AZURE_TENANT_ID}

以下示例演示如何使用用户凭据进行身份验证:

spring.cloud.azure:
credential:
client-id: ${AZURE_CLIENT_ID}
username: ${AZURE_USER_USERNAME}
password: ${AZURE_USER_PASSWORD}

以下示例演示如何使用不同的服务主体通过密钥保管库进行身份验证。此示例使用两个凭据配置应用程序:一个系统分配的托管标识和一个服务主体。密钥保管库机密客户端将使用服务主体,但任何其他组件都将改用托管标识。

spring.cloud.azure:
credential:
managed-identity-enabled: true
keyvault.secret:
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
profile:
tenant-id: ${AZURE_TENANT_ID}
使用 Azure Active Directory 授权访问

授权步骤要求将一个或多个 Azure 角色分配给安全主体。分配给安全主体的角色决定了主体将拥有的权限。

若要查看所有 Azure 内置角色的列表,请查看Azure 内置角色。

以下是用于授权访问Spring Cloud Azure中支持的Azure服务的Azure内置角色:

Table 10. Azure built-in roles

角色

描述

应用程序配置数据所有者

允许完全访问应用程序配置数据。

应用程序配置数据读取器

允许对应用程序配置数据进行读取访问。

Azure 事件中心数据所有者

允许完全访问 Azure 事件中心资源。

Azure Event Hubs Data Receiver

允许接收对 Azure 事件中心资源的访问权限。

Azure Event Hubs Data Sender

允许发送对 Azure 事件中心资源的访问权限。

Azure 服务总线数据所有者

允许完全访问 Azure 服务总线资源。

Azure 服务总线数据接收器

允许接收对 Azure 服务总线资源的访问权限。

Azure 服务总线数据发送方

允许发送对 Azure 服务总线资源的访问权限。

存储 Blob 数据所有者

提供对 Azure 存储 blob 容器和数据的完全访问权限,包括分配 POSIX 访问控制。

存储 Blob 数据读取器

读取并列出 Azure 存储容器和 Blob。

存储队列数据读取器

读取并列出 Azure 存储队列和队列消息。

Redis 缓存贡献者

管理 Redis 缓存。

使用 Spring Cloud Azure 资源管理器获取事件中心、服务总线和存储队列的连接字符串或 Redis 缓存的属性时,请分配 Azure 内置角色。适用于 Redis 的 Azure 缓存很特殊,还可以分配角色以获取 Redis 属性。​​Contributor​​​​Redis Cache Contributor​

Key Vault 访问策略确定给定的安全主体(即用户、应用程序或用户组)是否可以对 Key Vault 机密、密钥和证书执行不同的操作。可以使用 Azure 门户、Azure CLI 或 Azure PowerShell 分配访问策略。查看此处了解更多详情。

Azure Cosmos DB 公开了 2 个内置角色定义:and。但是,Azure 门户对角色管理的支持尚不可用。有关权限模型、角色定义和角色分配的更多详细信息,请查看此处​。​​Cosmos DB Built-in Data Reader​​​​Cosmos DB Built-in Data Contributor​

6.3.2. SAS 代币

它还可配置为支持使用共享访问签名 (SAS) 进行身份验证的服务。是要配置的属性。例如,用于向存储 Blob 服务进行身份验证。​​spring.cloud.azure.<azure-service>.sas-token​​​​spring.cloud.azure.storage.blob.sas-token​

6.3.3. 连接字符串

某些 Azure 服务支持连接字符串以提供连接信息和凭据。若要使用连接字符串连接到这些 Azure 服务,只需配置即可。例如,连接到事件中心服务。​​spring.cloud.azure.<azure-service>.connection-string​​​​spring.cloud.azure.eventhubs.connection-string​

7. 生产就绪

Spring Cloud Azure 4.0 支持应用程序配置、事件中心、Cosmos、密钥保管库证书、密钥保管库机密、存储 Blob、存储队列和存储文件共享的运行状况指示器。它还为所有基于 HTTP 的 Azure SDK 提供与 Spring Cloud Sleuth 的集成。例如,您现在可以通过 Spring 启动执行器端点探测存储 blob 是启动还是关闭,以及跟踪从应用程序到 Key Vault 的依赖项和延迟。

7.1. 启用健康指示器

添加 Spring Cloud Azure Actuator Startency。此依赖项还将包括。​​spring-boot-starter-actuator​

<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-actuator</artifactId>
</dependency>

Table 11. Configurable properties to enable or disable health indicators for each Azure service

Azure Service

财产

应用配置

管理健康。Azure-AppConfiguration.enabled

宇宙数据库

管理健康。azure-cosmos.enabled

事件中心

管理健康。Azure-eventhubs.enabled

密钥保管库证书

管理健康。azure-keyvault-certificate.enabled

密钥保管库机密

管理健康。azure-keyvault-secret.enabled

存储 Blob

管理健康。azure-storage-blob.enabled

存储文件共享

管理健康。azure-storage-fileshare.enabled

存储队列

管理健康。azure-storage-queue.enabled

调用 Azure 服务的运行状况终结点可能会产生额外费用。例如,调用以获取 Cosmos DB 运行状况信息,它将计算RU。​​HOST_NAME:{port}/actuator/health/cosmos​

要调用 的运行状况终结点,应配置该选项;否则,将返回 的运行状况。​​Cosmos​​​​spring.cloud.azure.cosmos.database​​​​unknown​

要调用 的运行状况终结点,角色 ofis 是用于授权的必需 ifis。​​Storage Queue​​​​Storage Account Contributor​​​​Azure AD​

7.2. 启用侦探

如果要使用 Spring Cloud Sdetectth 跟踪 Azure SDK 活动,请添加 Spring Cloud Azure 跟踪侦探依赖项。

<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-trace-sleuth</artifactId>
</dependency>

目前仅支持基于 HTTP 的 Azure SDK 客户端,例如,目前不支持具有 AMQP 传输的事件中心和服务总线,我们建议使用Azure 应用程序见解来满足此类要求。

8. 自动配置 Azure SDK 客户端

Spring Boot 简化了 Spring Cloud Azure 开发体验。Spring Cloud Azure 初学者是一组方便的依赖项描述符,可包含在您的应用程序中。它们处理对象实例化和配置逻辑,因此您不必这样做。每个启动器都依赖于提供关键的配置位,例如 Azure 云环境和身份验证信息。例如,您可以将这些配置为属性:​​spring-cloud-azure-starter​

spring:
cloud:
azure:
profile:
tenant-id: ${AZURE_TENANT_ID}
cloud-type: Azure
credential:
client-id: ${AZURE_CLIENT_ID}

​cloud-type​​​是可选的,因为它的默认值设置为。​​Azure​

这些属性是可选的,如果未指定,Spring Boot 将尝试自动为您查找它们。有关 Spring 引导如何查找这些属性的详细信息,请参阅文档。

8.1. 依赖设置

有两种方法可以使用Spring Cloud Azure初学者。一种是将 Azure SDK 与此依赖项一起使用。例如,使用 Cosmos DB:​​spring-cloud-azure-starter​

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-cosmos</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter</artifactId>
</dependency>

或者直接包含Spring Cloud Azure入门程序,而无需添加Azure SDK依赖项。例如,使用 Cosmos DB:

<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-cosmos</artifactId>
</dependency>

请参阅初学者依赖项有关 Spring Cloud Azure 支持的启动器列表。

​8.2. 配置​


如果选择使用安全主体通过 Azure Active Directory 进行身份验证和授权以访问 Azure 资源,请参阅通过 Azure​​AD 授权访问,​​以确保已向安全主体授予访问 Azure 资源的足够权限。

每个 Azure 服务的配置属性都位于前缀下。​​spring.cloud.azure.<azure-service>​


要查看所有与Spring Cloud Azure相关的配置属性的列表,请查看​​附录页面​​。

​8.3. 基本用法​

将以下属性添加到你将自动配置 Cosmos 客户端,两者都在上下文中可用,并且可以自动连线。​​application.yaml​​​​CosmosClient​​​​CosmosAsyncClient​

spring:
cloud:
azure:
cosmos:
database: ${AZURE_COSMOS_DATABASE_NAME}
endpoint: ${AZURE_COSMOS_ENDPOINT}
consistency-level: eventual
connection-mode: direct
class Demo {
@Autowired
private CosmosClient cosmosClient;

@Override
public void run() {
User item = User.randomUser();
CosmosContainer container = cosmosClient.getDatabase(databaseName).getContainer(containerName);
container.createItem(item);
}
}

​8.4. 示例​

有关更多详细信息,请参阅​​天蓝色弹簧启动示例​​。

​9. 资源处理​

Spring 项目提供了​​Spring​​资源抽象来访问许多低级资源。它提供了类似,和的接口。 Spring Cloud Azure 为 Azure 存储服务实现这些接口,允许您使用 Spring 编程模型与 Azure Storage Blob 和文件共享进行交互。它提供自动配置 Azure Storage Blob 和 Azure Storage File Share。​​Resource​​​​ResourceLoader​​​​ResourcePatternResolver​​​​spring-cloud-azure-starter-storage-blob​​​​spring-cloud-azure-starter-storage-file-share​

Table 12. Azure Storage related libraries.

起动机

服务

描述

spring-cloud-azure-starter-storage-blob

Azure Storage Blob

允许在块 blob 中大规模存储和访问非结构化数据。

弹簧-云-Azure-启动器-存储-文件共享

Azure 存储文件共享

提供完全托管的云文件共享,您可以通过行业标准服务器消息块 (SMB) 协议从任何位置访问这些文件共享。

​9.1. 依赖设置​

<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-storage-file-share</artifactId>
</dependency>
</dependencies>


仅在使用 Azure 存储 Blob 时需要。


仅在使用 Azure 存储文件共享时需要。


我们还提供支持存储的所有功能。如果选择使用它,是要配置的属性,默认值是。然后,您可以使用禁用不需要的服务。​​spring-cloud-azure-starter-storage​​​​spring.cloud.azure.storage.enable​​​​true​​​​spring.cloud.azure.storage.<storage-service>.enable​

​9.2. 配置​


如果选择使用安全主体通过 Azure Active Directory 进行身份验证和授权以访问 Azure 资源,请参阅通过 Azure​​AD 授权访问,​​以确保已向安全主体授予访问 Azure 资源的足够权限。

Table 13. Configurable properties of spring-cloud-azure-starter-storage-blob

财产

违约

描述

spring.cloud.azure.storage.blob.enabled

是否启用 Azure 存储 Blob。

spring.cloud.azure.storage.blob.endpoint

Azure Storage Blob 服务的终结点。

spring.cloud.azure.storage.blob.account-key

用于连接 Azure 存储 Blob 的私钥。

spring.cloud.azure.storage.blob.account-name

Azure 存储 Blob 帐户名称。

Table 14. Configurable properties of spring-cloud-azure-starter-storage-file-share

财产

违约

描述

spring.cloud.azure.storage.fileshare.enabled

是否启用 Azure 存储文件共享。

spring.cloud.azure.storage.fileshare.endpoint

Azure 存储文件共享服务的终结点。

spring.cloud.azure.storage.fileshare.account-key

用于连接 Azure 存储文件共享的私钥。

spring.cloud.azure.storage.fileshare.account-name

Azure 存储文件共享帐户名称。

9.3. 基本用法

在配置文件中提供以下属性。

spring:
cloud:
azure:
storage:
blob:
account-name: ${STORAGE_ACCOUNT_NAME}
account-key: ${STORAGE_ACCOUNT_KEY}
endpoint: ${STORAGE_BLOB_ENDPOINT}
fileshare:
account-name: ${STORAGE_ACCOUNT_NAME}
account-key: ${STORAGE_ACCOUNT_KEY}
endpoint: ${STORAGE_FILESHARE_ENDPOINT}

9.3.1. 获取资源

获取具有@Value的资源

可以使用批注来自动连线 Blob 资源。​​@Value("azure-blob://[your-container-name]/[your-blob-name]")​

@Value("azure-blob://[your-container-name]/[your-blob-name]")
private Resource storageBlobResource;

可以使用 @Value(“azure-file://[您的文件共享名称]/[您的文件名]”)的批注来自动连接文件资源。

@Value("azure-file://[your-fileshare-name]/[your-file-name]")
private Resource storageFileResource;
使用 ResourceLoader 获取资源
@Autowired
private ResourceLoader resourceLoader;
...
// get a BlobResource
Resource storageBlobResource = resourceLoader.getResource("azure-blob://[your-container-name]/[your-blob-name]");
// get a FileResource
Resource storageFileResource = resourceLoader.getResource("azure-file://[your-fileshare-name]/[your-file-name]");
通过搜索模式获取资源

您可以使用实现类来搜索资源。用于搜索资源,以及搜索资源。​​ResourcePatternResolver​​​​AzureStorageBlobProtocolResolver​​​​blob​​​​AzureStorageFileProtocolResolver​​​​file​

  • 模式搜索,搜索模式应该以or开头。例如,它表示列出所有容器中的所有 Blob;表示列出演示容器容器中的所有 Blob,包括任何子文件夹。azure-blob://azure-file://azure-blob://**/**azure-blob://demo-container/**
  • 位置搜索,搜索位置应以 or 开头,剩余的文件路径应存在,否则将引发异常。azure-blob://azure-file://
@Autowired
private AzureStorageBlobProtocolResolver azureStorageBlobProtocolResolver;

@Autowired
private AzureStorageFileProtocolResolver azureStorageFileProtocolResolver;

// get all text blobs
Resource[] blobTextResources = azureStorageBlobProtocolResolver.getResources("azure-blob://[container-pattern]/*.txt");
// get all text files
Resource[] fileTextResources = azureStorageFileProtocolResolver.getResources("azure-file://[fileshare-pattern]/*.txt");

9.3.2. 资源处理

从特定资源下载数据

可以使用的方法从 Azure Stroage Blob 或文件共享下载资源。​​getInputStream()​​​​Resource​

@Value("azure-blob://[your-container-name]/[your-blob-name]")
private Resource storageBlobResource;

@Value("azure-file://[your-fileshare-name]/[your-file-name]")
private Resource storageFileResource;

....

// download data as stream from blob resource
InputStream inputblobStream = storageBlobResource.getInputStream();
// download data as stream from file resource
InputStream inputfileStream = storageFileResource.getInputStream();
将数据上传到特定资源

可以通过强制转换 Springto 将资源上传到 Azure 存储 Blob 或文件共享。​​Resource​​​​WritableResource​

@Value("azure-blob://[your-container-name]/[your-blob-name]")
private Resource storageBlobResource;

@Value("azure-file://[your-fileshare-name]/[your-file-name]")
private Resource storageFileResource;

String data = "sampledata";

// upload string data to blob
try (OutputStream blobos = ((WritableResource) this.storageBlobResource).getOutputStream()) {
blobos.write(data.getBytes());
}
// upload string data to file
try (OutputStream fileos = ((WritableResource) this.storageFileResource).getOutputStream()) {
fileos.write(data.getBytes());
}

9.3.3. 分段上传

大于 4 MiB 的文件将并行上传到 Azure 存储。

9.4. 示例

有关更多详细信息,请参阅存储blob示例和存储文件示例。

10. 机密管理

Spring Cloud Azure 构造PropertySource,其中包含存储在 Azure Key Vault Secret 中的机密。

10.1. 依赖设置

<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>
</dependency>

我们还提供支持密钥保管库的所有功能。如果选择使用它,是要配置的属性,默认值是。然后,您可以使用禁用不需要的服务。​​spring-cloud-azure-starter-keyvault​​​​spring.cloud.azure.keyvault.enable​​​​true​​​​spring.cloud.azure.keyvault.<keyvault-service>.enable​

10.2. 基本用法

如果要对 byand 进行身份验证,则需要以下属性:​​client-id​​​​client-secret​

10.2.1. 配置属性

spring:
cloud:
azure:
keyvault:
secret:
property-sources:
- name: key-vault-property-souece-1
endpoint: ${ENDPOINT_1}
- name: key-vault-property-souece-2
endpoint: ${ENDPOINT_2}

10.2.2. Java 代码

@SpringBootApplication
public class SampleApplication implements CommandLineRunner {

@Value("${sampleProperty1}")
private String sampleProperty1;
@Value("${sampleProperty2}")
private String sampleProperty2;
@Value("${samplePropertyInMultipleKeyVault}")
private String samplePropertyInMultipleKeyVault;

public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}

public void run(String[] args) {
System.out.println("sampleProperty1: " + sampleProperty1);
System.out.println("sampleProperty2: " + sampleProperty2);
System.out.println("samplePropertyInMultipleKeyVault: " + samplePropertyInMultipleKeyVault);
}

}

10.3. 高级用法

10.3.1. 属性名称中的特殊字符

密钥保管库机密名称仅支持字符。参考:文件库名称和对象名称。如果属性名称包含其他字符,则可以使用以下解决方法:​​[0-9a-zA-Z-]​

  • 使用代替机密名称。不支持机密名称。如果应用程序具有包含的属性名称,例如,只需替换在 Azure 密钥保管库中保存机密时。例如:保存 Azure 密钥保管库。在应用程序中,仍可用于检索属性值。-...spring.datasource.url.-spring-datasource-urlspring.datasource.url

这种方法不能满足这样的要求。保存密钥保管库时,仅支持检索属性值,不支持。要处理这种情况,请参考以下选项:使用属性占位符。​​spring.datasource-url​​​​spring-datasource-url​​​​spring.datasource.url​​​​spring-datasource-url​​​​spring.datasource-url​

  • 使用属性占位符。例如:在应用程序中设置此属性。应用程序将获取密钥名称并将其值分配给。property.with.special.character_=${propertyWithoutSpecialCharacter}propertyWithoutSpecialCharacterproperty.with.special.character_

10.3.2. 区分大小写

默认情况下,机密名称不区分大小写。若要启用区分大小写模式,只需设置以下属性:​​spring.cloud.azure.keyvault.secret.property-sources[].case-sensitive=true​

10.3.3. 不检索密钥保管库中的所有机密

如果在密钥保管库中存储了 1000 个机密,并且只想使用其中的 3 个。您可以通过以下方式列出 3 个机密名称。​​spring.cloud.azure.keyvault.secret.property-sources[].secret-keys​

10.3.4. 设置刷新间隔

默认情况下,机密将每 30 分钟刷新一次。您可以配置时间依据。例如:表示每 60 分钟刷新一次。设置为禁用自动刷新。​​KeyVaultPropertySource​​​​spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval​​​​spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval=60m​​​​0​

10.3.5. 属性源优先级

如果键存在于多个属性源中,则哪个生效由优先级决定。

  • 如果没有属性源列表,则将采用最高优先级。SystemEnvironmentPropertySourceKeyVaultPropertySource
  • 如果存在 PropertySource 列表,则具有比 KeyVaultPropertySource 更高的优先级。这意味着可以使用环境变量替代应用程序中的密钥保管库机密值。SystemEnvironmentPropertySourceSystemEnvironmentPropertySource
  • 如果 PropertySource 列表中有多个 KeyVaultPropertySource,则定义顺序为优先级顺序。以上示例为例,优先级高于。key-vault-property-souece-1key-vault-property-souece-2

10.3.6. 所有可配置属性

Table 15. Configurable properties of Key Vault Secret PropertySource

财产

默认值

描述

spring.cloud.azure.keyvault.secret.property-source-enabled

是否启用密钥保管库属性源。

spring.cloud.azure.keyvault.secret.property-sources[].name

此属性源的名称。

spring.cloud.azure.keyvault.secret.property-sources[].endpoint

Azure 密钥保管库终结点。

spring.cloud.azure.keyvault.secret.property-sources[].区分大小写

密钥是否区分大小写。

spring.cloud.azure.keyvault.secret.property-sources[].secret-keys

此属性源支持的密钥。如果缺少此属性,则检索所有键。

spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval

30米

刷新所有密钥保管库机密的时间间隔。

spring.cloud.azure.keyvault.secret.property-sources[].service-version

发出 API 请求时使用的秘密服务版本。

spring.cloud.azure.keyvault.secret.property-sources[].client

客户端相关属性。

spring.cloud.azure.keyvault.secret.property-sources[].credential

凭据相关属性。

spring.cloud.azure.keyvault.secret.property-sources[].profile

配置文件相关属性。

spring.cloud.azure.keyvault.secret.property-sources[].proxy

代理相关属性。

spring.cloud.azure.keyvault.secret.property-sources[].retry

重试相关属性。

  • 请参阅使用 Azure AD 授予访问权限,确保已向安全主体授予访问 Azure 密钥保管库机密的足够权限。
  • 如果未在 中配置,,,,等常见属性,则将使用。请参阅配置以获取有关这些通用属性的详细信息。clientcredentialprofileproxyretryspring.cloud.azure.keyvault.secret.property-sources[].xxxspring.cloud.azure.xxx
  • 请参阅配置属性以获取有关嵌套属性的详细信息。

10.4. 示例

示例项目:属性源。

11. 弹簧数据支持

11.1. 弹簧数据宇宙数据库支持

Azure Cosmos DB是一种全球分布式数据库服务,允许开发人员使用各种标准 API(如 SQL、MongoDB、图形和 Azure 表存储)来处理数据。

11.2. 依赖设置

<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>
</dependency>

11.3. 配置

如果选择使用安全主体通过 Azure Active Directory 进行身份验证和授权以访问 Azure 资源,请参阅通过 AzureAD 授权访问,以确保已向安全主体授予访问 Azure 资源的足够权限。

Table 16. Configurable properties of spring-cloud-azure-starter-data-cosmos

财产

违约

描述

spring.cloud.azure.cosmos.enabled

是否启用了 Azure Cosmos 服务。

spring.cloud.azure.cosmos.database

宇宙数据库数据库 ID。

spring.cloud.azure.cosmos.endpoint

用于连接 Cosmos DB 的 Uri。

春天.云.蔚蓝.宇宙.key

用于连接 Cosmos DB 的私钥。

spring.cloud.azure.cosmos.credential.client-certificate-password

证书文件的密码。

spring.cloud.azure.cosmos.credential.client-certificate-path

使用 Azure 执行服务主体身份验证时要使用的 PEM 证书文件的路径。

spring.cloud.azure.cosmos.credential.client-id

使用 Azure 执行服务主体身份验证时要使用的客户端 ID。

spring.cloud.azure.cosmos.credential.client-secret

使用 Azure 执行服务主体身份验证时要使用的客户端密码。

spring.cloud.azure.cosmos.credential.managed-identity-enabled

是否启用托管标识。

spring.cloud.azure.cosmos.credential.password

使用 Azure 执行用户名/密码身份验证时使用的密码。

spring.cloud.azure.cosmos.credential.username

使用 Azure 执行用户名/密码身份验证时要使用的用户名。

spring.cloud.azure.cosmos.populate-query-metrics

填充诊断字符串和查询指标。

spring.cloud.azure.cosmos.consistency-level

Azure Cosmos DB 中的​​一致性级别​​。

​11.4. 关键概念​

  • Spring Data CrudRepository 和 ReactiveCrudRepository 基本 CRUD 功能
  • 查找全部
  • 查找一个按 ID
  • 全部删除
  • 按 ID 删除
  • 删除实体
  • 弹簧数据@Id注释。 有两种方法可以将域类中的字段映射到 Azure Cosmos DB 文档。id
  • 使用 @Id 批注域类中的字段,此字段将映射到 Cosmos DB 中的文档。id
  • 将此字段的名称设置为,此字段将映射到 Cosmos DB 中的文档。 [注意] 如果两种方式都适用,idid
  • 自定义集合名称。 默认情况下,集合名称将是用户域类的类名。要自定义它,请向域类添加注释,仅此而已。@Document(collection="myCustomCollectionName")
  • 支持Azure Cosmos DB 分区。要将域类的字段指定为分区键字段,只需对其进行批注即可。执行 CRUD 操作时,请指定分区值。有关分区 CRUD 的更多示例,请参阅此处的测试@PartitionKey
  • 支持弹簧数据自定义查询查找操作。
  • 支持弹簧启动启动器数据休息。
  • 支持域类中的列表和嵌套类型。

11.5. 基本用法

11.5.1. 使用私钥访问 CosmosDB

将 CosmosDB 连接到主键的最简单方法是主键,添加以下属性,就可以开始了。​​spring-cloud-azure-starter-data-cosmos​

spring:
cloud:
azure:
cosmos:
key: ${AZURE_COSMOS_KEY}
endpoint: ${AZURE_COSMOS_ENDPOINT}
database: ${AZURE_COSMOS_DATABASE}

11.5.2. Define an Entity

Define a simple entity as Document in Cosmos DB.

@Container(containerName = "mycollection")
public class User {
@Id
private String id;
private String firstName;
@PartitionKey
private String lastName;
private String address;

public User() {
}

public User(String id, String firstName, String lastName, String address) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public String toString() {
return String.format("%s %s, %s", firstName, lastName, address);
}
}

​id​​字段将用作 Azure Cosmos DB 中的文档。或者,您可以注释任何字段以将其映射到文档。​​id​​​​@Id​​​​id​

批注用于指定 Azure Cosmos DB 中文档的集合名称。​​@Container(containerName = "mycollection")​

11.5.3. 创建仓库

扩展了ReactiveCosmosRepository接口,该接口提供Spring Data存储库支持。

@Repository
public interface UserRepository extends ReactiveCosmosRepository<User, String> {

Flux<User> findByFirstName(String firstName);
}

到目前为止,ReactiveCosmosRepository 提供了基本的保存、删除和查找操作。稍后将支持更多操作。

11.5.4. 创建应用程序类

在这里创建一个包含所有组件的应用程序类

@SpringBootApplication
public class CosmosSampleApplication implements CommandLineRunner {

private static final Logger LOGGER = LoggerFactory.getLogger(CosmosSampleApplication.class);

@Autowired
private UserRepository repository;

@Autowired
private CosmosProperties properties;

public static void main(String[] args) {
SpringApplication.run(CosmosSampleApplication.class, args);
}

public void run(String... var1) {
final User testUser = new User("testId", "testFirstName",
"testLastName", "test address line one");

// Save the User class to Azure Cosmos DB database.
final Mono<User> saveUserMono = repository.save(testUser);

final Flux<User> firstNameUserFlux = repository.findByFirstName("testFirstName");

// Nothing happens until we subscribe to these Monos.
// findById will not return the user as user is not present.
final Mono<User> findByIdMono = repository.findById(testUser.getId());
final User findByIdUser = findByIdMono.block();
Assert.isNull(findByIdUser, "User must be null");

final User savedUser = saveUserMono.block();
Assert.state(savedUser != null, "Saved user must not be null");
Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()),
"Saved user first name doesn't match");

firstNameUserFlux.collectList().block();

final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();
Assert.isTrue(optionalUserResult.isPresent(), "Cannot find user.");

final User result = optionalUserResult.get();
Assert.state(result.getFirstName().equals(testUser.getFirstName()),
"query result firstName doesn't match!");
Assert.state(result.getLastName().equals(testUser.getLastName()),
"query result lastName doesn't match!");
LOGGER.info("findOne in User collection get result: {}", result.toString());

}

@PostConstruct
public void setup() {
// For this example, remove all of the existing records.
this.repository.deleteAll().block();
}
}

自动连线的用户存储库界面,然后可以做保存,删除和查找操作。

11.6. 示例

有关更多详细信息,请参阅天蓝色弹簧启动示例。

除了使用库之外,您还可以直接将库用于更复杂的场景。有关更多详细信息,请参阅Azure Cosmos DB 的 Spring 数据。spring-cloud-azure-starter-data-cosmosazure-spring-data-cosmos

12. 弹簧安全支持

12.1. Spring Security with Azure Active Directory

构建 Web 应用程序时,标识和访问管理将始终是基础部分。

Azure 提供了一个很好的平台来使应用程序开发之旅民主化,因为它不仅提供基于云的标识服务,而且还与 Azure 生态系统的其余部分深度集成。

Spring 安全性通过强大的抽象和可扩展的接口可以轻松保护基于 Spring 的应用程序。但是,尽管 Spring 框架功能强大,但它并不是针对特定的身份提供程序量身定制的。

提供将 Web 应用程序连接到 Azure Active Directory(简称 Azure AD)租户并使用 Azure AD 保护资源服务器的最佳方法。它使用 Oauth 2.0 协议来保护 Web 应用程序和资源服务器。spring-cloud-azure-starter-active-directory

12.1.1. 访问 Web 应用程序

此方案使用OAuth 2.0 授权代码授予流登录具有 Microsoft 帐户的用户。

系统示意图

Spring Cloud Azure 参考文档_spring_03

在 Azure 中创建所需的资源
  1. 阅读有关向 Microsoft 标识平台注册应用程序的 MS 文档。
  2. 创建应用注册。得到,和。AZURE_TENANT_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRET
  3. 例如,塞托。尾矿是必需的。redirect URIAPPLICATION_BASE_URI/login/oauth2/code/localhost:8080/login/oauth2/code//
添加所需的依赖项
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
添加必需属性
spring:
cloud:
azure:
active-directory:
profile:
tenant-id: ${AZURE_TENANT_ID}
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}

现在启动您的应用程序并通过浏览器访问您的应用程序,然后您将被重定向到 Microsoft 登录页面。

高级用法
添加额外的安全配置
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {

/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.anyRequest().authenticated();
// Do some custom configuration
}
}
按应用角色授权访问
  • 步骤 1:在 Azure 中创建所需的资源
  1. 阅读有关将应用角色添加到应用程序并在令牌中接收它们的 MS 文档。
  2. 使用以下参数创建应用角色:
  • 显示名称:管理员
  • 允许的成员类型:用户/组
  • 值:管理员
  • 是否要启用此应用角色:是


如果要使用基于应用角色的访问控制,则无法将组名称声明为 。引用:​​配置组可选声明​​​。​​role​

  • 步骤2:保护特定方法。
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
按组名称或组 ID 授权访问
  • 步骤 1:添加相关配置属性。
spring:
cloud:
azure:
active-directory:
user-group:
allowed-group-names: group1_name_1, group2_name_2
# 1. If allowed-group-ids == all, then all group id will take effect.
# 2. If "all" is used, we should not configure other group ids.
# 3. "all" is only supported for allowed-group-ids, not supported for allowed-group-names.
allowed-group-ids: group_id_1, group_id_2
  • 步骤2:保护特定方法。
@Controller
public class RoleController {
@GetMapping("group1")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group1')")
public String group1() {
return "group1 message";
}

@GetMapping("group2")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group2')")
public String group2() {
return "group2 message";
}

@GetMapping("group1Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group1-id>')")
public String group1Id() {
return "group1Id message";
}

@GetMapping("group2Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group2-id>')")
public String group2Id() {
return "group2Id message";
}
}
使用国家 Azure 而不是全局 Azure

现在,除全球 Azure 云外,Azure Active Directory 部署在以下国家/地区云中:

  • 蔚蓝政府
  • 蔚蓝中国 21Vianet
  • 蔚蓝德国

下面是要使用 Azure 中国 21Vianet 的示例。

spring:
cloud:
azure:
active-directory:
base-uri: https://login.partner.microsoftonline.cn
graph-base-uri: https://microsoftgraph.chinacloudapi.cn

您可以参考这些 MS 文档,从MS 文档中获取有关国家云部署的更多信息。

配置重定向 URI 模板

开发人员可以自定义重定向 URI。

Spring Cloud Azure 参考文档_应用程序_04

  • 第 1 步:在 application.yml 中添加属性。redirect-uri-template
spring:
cloud:
azure:
active-directory:
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
  • 步骤 2:在 Azure 门户中更新重定向 URI。

Spring Cloud Azure 参考文档_spring_05

  • 步骤 3:更新网络安全配置器适配器

设置重定向 uri 模板后,我们需要更新:​​WebSecurityConfigurerAdapter​

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.oauth2Login()
.loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
.and()
.authorizeRequests()
.anyRequest().authenticated();
}
}
通过代理连接到 Azure AD

若要通过代理连接 Azure AD,只需提供如下所示的 abean:​​RestTemplateCustomizer​

@Configuration
class DemoConfiguration {
@Bean
public RestTemplateCustomizer proxyRestTemplateCustomizer() {
return (RestTemplate restTemplate) -> {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);
restTemplate.setRequestFactory(requestFactory);
};
}
}
样品

示例项目:aad-web-application。

12.1.2. Web 应用程序访问资源服务器

系统示意图
在 Azure 中创建所需的资源
  1. 阅读有关向 Microsoft 标识平台注册应用程序的 MS 文档。
  2. 创建应用注册。得到,和。AZURE_TENANT_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRET
  3. 例如,塞托。尾矿是必需的。redirect URIAPPLICATION_BASE_URI/login/oauth2/code/localhost:8080/login/oauth2/code//
添加所需的依赖项
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
添加必需属性
spring:
cloud:
azure:
active-directory:
profile:
tenant-id: ${AZURE_TENANT_ID}
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
scopes: https://graph.microsoft.com/Analytics.Read, email

这里,是名称,表示登录时需要同意的范围。graphOAuth2AuthorizedClientscopes

在应用程序中使用 OAuth2AuthorizedClient
public class Demo {
@GetMapping("/graph")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphClient) {
// toJsonString() is just a demo.
// oAuth2AuthorizedClient contains access_token. We can use this access_token to access resource server.
return toJsonString(graphClient);
}
}

现在启动您的应用程序并通过浏览器访问您的应用程序,然后您将被重定向到 Microsoft 登录页面。

高级用法
客户端凭据流

默认流是授权代码流,如果要使用客户端凭据流,可以这样配置:

spring:
cloud:
azure:
active-directory:
profile:
tenant-id: ${AZURE_TENANT_ID}
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
authorization-grant-type: client_credentials # Change type to client_credentials
scopes: https://graph.microsoft.com/Analytics.Read, email
访问多个资源服务器

在一个 Web 应用程序中,可以通过如下所示的配置来访问多个资源服务器:

spring:
cloud:
azure:
active-directory:
profile:
tenant-id: ${AZURE_TENANT_ID}
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
resource-server-1:
scopes: # Scopes for resource-server-1
resource-server-2:
scopes: # Scopes for resource-server-2

然后,您可以在这样的应用程序中使用OAuth2AuthorizedClient。

public class Demo {
@GetMapping("/resource-server-1")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("resource-server-1") OAuth2AuthorizedClient client) {
return callResourceServer1(client);
}

@GetMapping("/resource-server-2")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("resource-server-2") OAuth2AuthorizedClient client) {
return callResourceServer2(client);
}
}

在前面的示例中,所有范围都将在客户首次登录时同意,无论它属于资源服务器 1 还是资源服务器 2。如果不想让客户同意所有范围,可以执行以下操作:

spring:
cloud:
azure:
active-directory:
profile:
tenant-id: ${AZURE_TENANT_ID}
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
resource-server-1:
scopes: # Scopes for resource-server-1
resource-server-2:
on-demand: true # means incremental consent
scopes: # Scopes for resource-server-2
样品

示例项目:aad-web-application。

12.1.3. 访问资源服务器

此方案不支持登录,只需通过验证访问令牌来保护服务器。如果访问令牌有效,服务器将处理请求。

系统示意图

Spring Cloud Azure 参考文档_应用程序_06

在 Azure 中创建所需的资源

阅读有关向 Microsoft 标识平台注册应用程序的 MS 文档。

创建应用注册。获取。AZURE_CLIENT_ID

阅读有关配置应用程序以公开 Web API 的 MS 文档。

公开具有名为“范围”的 Web API。Scope-1

添加所需的依赖项
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
</dependencies>
添加必需属性
spring:
cloud:
azure:
active-directory:
credential:
client-id: ${AZURE_CLIENT_ID}

现在启动应用程序并访问应用程序的 Web API。

  1. 您将在没有访问令牌的情况下获得 401。
  2. 使用访问令牌访问应用程序,将验证访问令牌中的以下声明:
  • iss:访问令牌必须由 Azure AD 颁发。
  • nbf​:当前时间不能以前。nbf
  • exp​:当前时间不能之后。exp
  • aud​:对于配置,受众必须等于配置器。如果未配置 2 个属性,则不会验证此声明。spring.cloud.azure.active-directory.credential.client-idspring.cloud.azure.active-directory.credential.app-id-uriclient-idapp-id-uri

请参阅有关 Microsoft 标识平台访问令牌的 MS 文档,以获取有关访问令牌的详细信息。

高级用法
添加额外的安全配置
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
}
}
按范围验证权限
  • 步骤 1::在 Azure 中创建所需的资源
  • 阅读有关配置应用程序以公开 Web API 的 MS 文档。
  • 公开具有名为“范围”的 Web API。Scope1
  • 步骤2:保护特定方法。
class Demo {
@GetMapping("scope1")
@ResponseBody
@PreAuthorize("hasAuthority('SCOPE_Scope1')")
public String scope1() {
return "Congratulations, you can access `scope1` endpoint.";
}
}

通过执行此操作,当访问终结点时,将验证访问令牌中的以下声明:/scope1

  • scp​:该值必须包含。Scope1
按应用角色验证权限
  • 步骤 1:在 Azure 中创建所需的资源
  1. 阅读有关将应用角色添加到应用程序并在令牌中接收它们的 MS 文档。
  2. 使用以下参数创建应用角色:
  • 显示名称:应用角色 1
  • 允许的成员类型:用户/组
  • 值:应用角色 1
  • 是否要启用此应用角色:是
  • 步骤2:保护特定方法。
class Demo {
@GetMapping("app-role1")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_AppRole1')")
public String appRole1() {
return "Congratulations, you can access `app-role1` endpoint.";
}
}

通过执行此操作,当访问终结点时,将验证访问令牌中的以下声明:/app-role1

  • roles​:该值必须包含。AppRole1
使用 JWT 客户端身份验证
  1. 阅读有关向微软标识平台注册证书的 MS 文档。
  2. 将 .pem证书上传到在 Azure 门户中注册的应用程序。
  3. 配置证书路径和密码。PFX* 或。P12* 证书。
  4. 将属性配置添加到要通过 JWT 客户端身份验证进行身份验证的客户端。spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt

下面是 Web 应用程序方案的示例配置文件,证书信息在全局属性中配置:

spring:
cloud:
azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: ${AZURE_TENANT_ID}
active-directory:
enabled: true
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
on-demand: true
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials

还可以在服务中配置证书信息属性:active-directory

spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: ${AZURE_TENANT_ID}
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
on-demand: true
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials
通过代理连接到 Azure AD

若要通过代理连接 Azure AD,需要提供 abean。有关详细信息,请参阅通过代理连接到 Azure AD 的 Web 应用程序​部分。RestTemplateCustomizer

样品

示例项目:aad 资源服务器。