使用组和组声明保护 Java Spring Boot 应用

本文演示了一个 Java Spring Boot Web 应用,该应用使用适用于 JavaMicrosoft Entra ID Spring Boot Starter 客户端库进行身份验证、授权和令牌获取。 该应用使用 OpenID Connect 协议登录用户,并根据 Microsoft Entra ID 安全组成员身份限制对页面的访问。

下图显示了应用的拓扑:

显示应用的拓扑的关系图。

客户端应用使用适用于 Java 的 Microsoft Entra ID Spring Boot Starter 客户端库在 Microsoft Entra ID 租户中登录用户,并从 Microsoft Entra ID 获取 ID 令牌

ID 令牌包含组声明。 应用程序将声明加载到已登录用户的 Spring GrantedAuthorities 列表中。 这些值确定用户有权访问的页面。

有关涵盖此方案的视频,请参阅 使用应用角色、安全组、范围和目录角色在应用程序中实现授权。

先决条件

  • JDK 版本 15。 此示例是在 Java 15 系统上开发的,但它可能与其他版本兼容。
  • Maven 3
  • 建议在 Visual Studio Code 中运行此示例的 Java 扩展包。
  • Microsoft Entra ID 租户。 有关详细信息,请参阅快速入门:设置租户
  • Microsoft Entra ID 租户中的用户帐户。 此示例不适用于个人Microsoft帐户。 因此,如果使用个人帐户登录到Azure 门户,并且目录中没有用户帐户,则需要立即创建一个。
  • 两个安全组,命名 AdminGroupUserGroup包含要对此示例进行签名和测试的用户或用户。 或者,可以将用户添加到租户中的两个现有安全组。 如果选择使用现有组,请务必修改示例配置,以使用现有安全组的名称和对象 ID。
  • Visual Studio Code
  • 用于 Visual Studio Code 的 Azure 工具

建议

设置示例

以下部分演示如何设置示例应用程序。

克隆或下载示例存储库

若要克隆示例,请打开 Bash 窗口并使用以下命令:

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/3-Authorization-II/groups

或者,导航到 ms-identity-msal-java-samples 存储库,然后将其下载为 .zip 文件并将其提取到硬盘驱动器。

重要

若要避免 Windows 上的文件路径长度限制,请将存储库克隆或提取到硬盘驱动器根附近的目录中。

将示例应用程序注册到 Microsoft Entra ID 租户

此示例中有一个项目。 以下部分演示如何使用Azure 门户注册应用。

选择要在其中创建应用程序的Microsoft Entra ID 租户

若要选择租户,请使用以下步骤:

  1. 登录到 Azure 门户

  2. 如果帐户存在于多个Microsoft Entra ID 租户中,请选择Azure 门户角的配置文件,然后选择“切换目录”,将会话更改为所需的Microsoft Entra ID 租户。

注册应用(java-spring-webapp-groups)

若要注册应用,请使用以下步骤:

  1. 导航到Azure 门户并选择Microsoft Entra ID

  2. 在导航窗格中选择 “应用注册 ”,然后选择“ 新建注册”。

  3. 显示的“注册应用程序”页 中,输入以下应用程序注册信息:

    • 在“ 名称 ”部分中,输入一个有意义的应用程序名称,以便向应用的用户显示,例如 java-spring-webapp-groups
    • 在“支持的帐户类型”下,选择“仅此组织目录中的帐户” 。
    • “重定向 URI”(可选)部分中,在组合框中选择“Web”,然后输入以下重定向 URI: http://localhost:8080/login/oauth2/code/
  4. 选择“注册”以创建应用程序。

  5. 在应用的注册页上,查找并复制 应用程序(客户端)ID 值以供以后使用。 在应用的配置文件或文件中使用此值。

  6. 在应用的注册页上,选择 导航窗格中的“证书和机密 ”,打开可以生成机密并上传证书的页面。

  7. 在“客户端密码”部分中,选择“新建客户端密码” 。

  8. 键入说明 - 例如应用 机密

  9. 选择其中一个可用持续时间: 6 个月12 个月自定义

  10. 选择 添加 。 将显示生成的值。

  11. 复制并保存生成的值,以便在后续步骤中使用。 代码的配置文件需要此值。 此值不会再次显示,不能通过任何其他方式检索该值。 因此,在导航到任何其他屏幕或窗格之前,请务必将其从Azure 门户保存。

  12. 在应用的注册页上,选择 导航窗格中的 API 权限 以打开页面,可在其中添加对应用程序所需的 API 的访问权限。

  13. 选择添加权限

  14. 确保已选择“Microsoft API”选项卡。

  15. 在“常用 Microsoft API”部分,选择“Microsoft Graph”。

  16. “委派权限 ”部分中, 从列表中选择 GroupMember.Read.All 。 如有必要,请使用搜索框。 如果出现超额方案,则需要此权限才能通过 Graph 获取组成员身份。

  17. 选择用于授予管理员同意的 GroupMember.Read.All按钮。

  18. 选择“添加权限”。

创建安全组

若要创建安全组,请使用以下步骤:

  1. 导航到Azure 门户并选择Microsoft Entra ID

  2. 在导航窗格中选择 “组 ”。

  3. “组 ”窗格中,选择“ 新建组”,然后提供以下信息:

    • 对于 组类型,请选择“ 安全性”。
    • 对于 组名称,请输入 AdminGroup
    • 对于 组说明,请输入 管理员安全组
    • 添加 要在此示例中使用和测试的组所有者组成员
    • 选择创建
  4. “组 ”窗格中,选择“ 新建组”,然后提供以下信息:

    • 对于 组类型,请选择“ 安全性”。
    • 对于 组名称,请输入 UserGroup
    • 对于 组说明,请输入 用户安全组
    • 添加 要在此示例中使用和测试的组所有者组成员
    • 选择创建

有关详细信息,请参阅管理 Microsoft Entra 组和组成员身份

配置安全组

可使用以下选项来进一步配置应用程序以接收组声明:

注意

若要获取本地组的samAccountName或组 ID,请参阅有关使用从 Active Directory 同步的组属性的先决条件部分,该节使用 Microsoft Entra ID 为应用程序配置组声明中的组属性On Premises Group Security Identifier

将应用程序配置为接收已登录用户分配到的所有组,包括嵌套组

若要配置应用,请使用以下步骤:

  1. 在应用的注册页上,选择 导航窗格中的“令牌配置 ”以打开页面,可在其中配置颁发给应用程序的声明提供的令牌。

  2. 选择“ 添加组声明 ”以打开 “编辑组声明 ”屏幕。

  3. 选择安全组所有组(包括通讯组列表,但不包括分配给应用程序的组)。 选择这两个选项将否定安全组选项的效果

  4. “ID ”部分下,选择“ 组 ID”。 此选择会导致Microsoft Entra ID 发送用户在登录用户后收到的 ID 令牌的组声明中向用户分配的对象 ID ID。

将应用程序配置为从用户可能分配到的已筛选组组接收组声明值

如果出现以下情况,此选项非常有用:

  • 应用程序对一组选定的组感兴趣,这些组可能分配有登录用户。
  • 你的应用对此用户分配到的租户中的每个安全组不感兴趣。

此选项可帮助应用程序避免 超额 问题。

注意

此功能在 Microsoft Entra ID 免费版不可用。

使用此选项时,嵌套组分配不可用。

若要在应用中启用此选项,请使用以下步骤:

  1. 在应用的注册页上,选择 导航窗格中的“令牌配置 ”以打开页面,可在其中配置颁发给应用程序的声明提供的令牌。

  2. 选择“ 添加组声明 ”以打开 “编辑组声明 ”屏幕。

  3. 选择 分配给应用程序的 组,不选择任何其他选项。 如果选择更多选项(如安全组所有组(包括分配给应用程序的通讯组,但不包括分配给应用程序的组),这些选项将否定分配给应用程序选项的组的效果。

  4. “ID ”部分下,选择“ 组 ID”。 此选择会导致Microsoft Entra ID 发送用户在登录用户后收到的 ID 令牌的组声明中向用户分配的对象 ID ID。

  5. 如果使用“公开 API”选项公开 Web API,则还可以选择“访问”部分下的“组 ID”选项。 此选择会导致Microsoft Entra ID 将用户分配到的组的对象 ID 发送到 API 客户端应用程序的访问令牌的组声明中。

  6. 在应用的注册页上,选择导航窗格中的“概述以打开“应用程序概述”屏幕。

  7. 选择具有本地目录中托管应用程序中应用程序名称的超链接。 此字段标题可能被截断 - 例如, ...中的托管应用程序。选择此链接时,导航到 与在其中创建应用程序的租户中的应用程序服务主体关联的企业应用程序概述 页。 可以使用浏览器的后退按钮导航回应用注册页。

  8. 在导航窗格中选择“ 用户和组 ”,打开可以向应用程序分配用户和组的页面。

  9. 选择“添加用户”。

  10. 从结果屏幕中选择 “用户和组 ”。

  11. 选择要分配给此应用程序的组。

  12. 选择“ 选择 ”以完成组选择。

  13. 选择“ 分配 ”以完成组分配过程。

    当用户登录到应用时,应用程序现在会在组声明中接收这些选定的组,该组是其中一个或多个已分配组的成员。

  14. 在导航窗格中选择“属性以打开列出应用程序的基本属性的页面。 将 “需要用户分配?” 标志设置为 “是”。

重要

将“用户分配”设置为“是时,Microsoft Entra ID 会检查“用户和组”窗格中只有分配给应用程序的用户才能登录到应用。 可以直接分配用户,也可以分配他们所属的安全组。


配置代码示例以使用应用注册和安全组(java-spring-webapp-groups)

使用以下步骤配置应用:

注意

在以下步骤中, ClientIDApplication IDAppId相同。

  1. 在 IDE 中打开项目。

  2. 打开 src\main\resources\application.yml 文件。

  3. 找到占位符 Enter_Your_Tenant_ID_Here ,并将现有值替换为Microsoft Entra 租户 ID。

  4. 找到占位符Enter_Your_Client_ID_Here,并将现有值替换为从Azure 门户复制的应用程序 ID 或java-spring-webapp-groupsclientId应用。

  5. 找到占位符Enter_Your_Client_Secret_Here,并将现有值替换为在创建java-spring-webapp-groups从Azure 门户复制期间保存的值。

  6. 找到占位符Enter_Your_Admin_Group_ID_Here,并将现有值替换为 objectId AdminGroup 的值

  7. 找到占位符Enter_Your_User_Group_ID_Here,并将现有值替换为 objectId UserGroup 的值

  8. 打开 src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java 文件。

  9. 找到占位符Enter_Your_Admin_Group_ID_Here,并将现有值替换为 objectId AdminGroup 的值

  10. 找到占位符Enter_Your_User_Group_ID_Here,并将现有值替换为 objectId UserGroup 的值

运行示例

以下部分介绍如何将示例部署到 Azure Spring Apps。

先决条件

准备 Spring 项目

使用以下步骤来准备项目:

  1. 使用以下 Maven 命令生成项目:

    mvn clean package
    
  2. 使用以下命令在本地运行示例项目:

    mvn spring-boot:run
    

配置 Maven 插件

在项目的根目录中运行以下命令,使用适用于 Azure Spring AppsMaven 插件配置应用:

mvn com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config

以下列表描述了命令交互:

  • OAuth2 登录名:需要根据 OAuth2 协议授权登录到 Azure。
  • 选择订阅:选择要在其中创建 Azure Spring Apps 实例的订阅列表编号,该实例默认为列表中的第一个订阅。 如果要使用默认数字,请按 Enter
  • 输入 Azure Spring Apps 名称:输入要创建的 Spring 应用实例的名称。 如果要使用默认名称,请按 Enter
  • 输入资源组名称:输入要在其中创建 Spring 应用实例的资源组的名称。 如果要使用默认名称,请按 Enter
  • Sku:选择要用于 Spring 应用实例的 SKU。 如果要使用默认数字,请按 Enter
  • 输入应用名称(演示):提供应用名称。 如果要使用默认项目项目 ID,请按 Enter
  • 运行时:选择要用于 Spring 应用实例的运行时。 在这种情况下,应使用默认数字,请按 Enter
  • 公开此应用的公共访问权限 (boot-for-azure):按 y
  • 确认保存上述所有配置:按 y。 如果按 n,则配置不会保存在 .pom 文件中。

以下示例显示了部署过程的输出:

Summary of properties:
Subscription id   : 12345678-1234-1234-1234-123456789101
Resource group name : rg-ms-identity-spring-boot-webapp
Azure Spring Apps name : cluster-ms-identity-spring-boot-webapp
Runtime Java version : Java 11
Region            : eastus
Sku               : Standard
App name          : ms-identity-spring-boot-webapp
Public access     : true
Instance count/max replicas : 1
CPU count         : 1
Memory size(GB)   : 2
Confirm to save all the above configurations (Y/n):
[INFO] Configurations are saved to: /home/user/ms-identity-msal-java-samples/4-spring-web-app/1-Authentication/sign-in/pom.    xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:57 min
[INFO] Finished at: 2024-02-14T13:50:44Z
[INFO] ------------------------------------------------------------------------

确认选择后,该插件会将所需的插件元素和设置添加到项目的 pom.xml 文件中,以将应用配置为在 Azure Spring Apps 中运行。

pom.xml文件的相关部分应类似于以下示例:

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-spring-apps-maven-plugin</artifactId>
    <version>1.19.0</version>
    <configuration>
        <subscriptionId>12345678-1234-1234-1234-123456789101</subscriptionId>
        <resourceGroup>rg-ms-identity-spring-boot-webapp</resourceGroup>
        <clusterName>cluster-ms-identity-spring-boot-webapp</clusterName>
        <region>eastus</region>
        <sku>Standard</sku>
        <appName>ms-identity-spring-boot-webapp</appName>
        <isPublic>true</isPublic>
        <deployment>
            <cpu>1</cpu>
            <memoryInGB>2</memoryInGB>
            <instanceCount>1</instanceCount>
            <runtimeVersion>Java 11</runtimeVersion>
            <resources>
                <resource>
                    <directory>${project.basedir}/target</directory>
                    <includes>
                        <include>*.jar</include>
                    </includes>
                </resource>
            </resources>
        </deployment>
    </configuration>
</plugin>

可以直接在 pom.xml 文件中修改 Azure Spring Apps 的配置。 下表列出了一些常见配置:

properties 必选 说明
subscriptionId false 订阅的 ID。
resourceGroup Azure Spring Apps 实例的 Azure 资源组。
clusterName Azure Spring Apps 群集名称。 如果使用已部署 Azure Spring Apps 实例的订阅和资源组,也可以使用此现有群集部署到该群集。
appName Azure Spring Apps 中的应用的名称。
region false 要在其中托管 Azure Spring Apps 实例的区域。 默认值为 eastus。 有关有效区域,请参阅 支持的区域
sku false Azure Spring Apps 实例的定价层。 默认值 Basic仅适用于开发和测试环境。
runtime false 运行时环境配置。 有关详细信息,请参阅配置详细信息
deployment false 部署配置。 有关详细信息,请参阅配置详细信息

有关配置的完整列表,请参阅插件参考文档。 所有 Azure Maven 插件共享一组常见的配置。 有关这些配置,请参阅 常见配置。 有关特定于 Azure Spring Apps 的配置,请参阅 Azure Spring Apps:配置详细信息

请务必保存保留这些 clusterName 值, appName 供以后使用。

准备应用进行部署

将应用程序部署到 Azure Spring Apps 时,重定向 URL 将更改为 Azure Spring Apps 中已部署的应用实例的重定向 URL。 使用以下步骤更改application.yml文件中的这些设置

  1. 导航到应用的 src\main\resources\application.yml 文件并更改已部署应用的域名的值 post-logout-redirect-uri ,如以下示例所示。 例如,如果在cluster-ms-identity-spring-boot-webapp上一步中选择了 Azure Spring Apps 实例和ms-identity-spring-boot-webapp应用名称,则现在必须用于https://cluster-ms-identity-spring-boot-webapp-ms-identity-spring-boot-webapp.azuremicroservices.iopost-logout-redirect-uri该值。

    post-logout-redirect-uri: https://<cluster-name>-<app-name>.azuremicroservices.io
    
  2. 保存此文件后,使用以下命令重新生成应用:

    mvn clean package
    

重要

应用程序的application.yml文件当前在参数中client-secret保存客户端机密的值。 最好将此值保存在此文件中。 如果将其提交到 Git 存储库,则也可能面临风险。

作为额外的安全步骤,可以将此值存储在 Azure 密钥库中,并从密钥库加载机密,使其在应用程序中可用。

更新Microsoft Entra ID 应用注册

由于重定向 URI 更改为 Azure Spring Apps 上的已部署应用,因此还需要更改 Microsoft Entra ID 应用注册中的重定向 URI。 若要进行此更改,请使用以下步骤:

  1. 导航到面向开发人员的 Microsoft 标识平台应用注册页

  2. 使用搜索框搜索应用注册 ,例如 java-servlet-webapp-authentication

  3. 通过选择应用名称打开应用注册。

  4. 从菜单中选择“身份验证”。

  5. “Web - 重定向 URI”部分中,选择“添加 URI”。

  6. 填写应用的 URI,追加 /login/oauth2/code/ - 例如。 https://<cluster-name>-<app-name>.azuremicroservices.io/login/oauth2/code/

  7. 选择“保存”。

部署应用

使用以下命令部署应用:

mvn azure-spring-apps:deploy

以下列表描述了命令交互:

  • OAuth2 登录名:需要根据 OAuth2 协议授权登录到 Azure。

执行命令后,你会从以下日志消息中看到部署已成功:

[INFO] Deployment(default) is successfully created
[INFO] Starting Spring App after deploying artifacts...
[INFO] Deployment Status: Running
[INFO]   InstanceName:demo-default-x-xxxxxxxxxx-xxxxx  Status:Running Reason:null       DiscoverStatus:UNREGISTERED
[INFO]   InstanceName:demo-default-x-xxxxxxxxx-xxxxx  Status:Terminating Reason:null       DiscoverStatus:UNREGISTERED
[INFO] Getting public url of app(demo)...
[INFO] Application url: https://<your-Azure-Spring-Apps-instance-name>-demo.azuremicroservices.io

验证应用

部署完成后,使用输出应用程序 URL 来访问应用程序。 按以下步骤检查应用程序的日志,以调查任何部署问题:

  1. “部署”部分的“输出”页访问输出应用程序 URL。

  2. 在 Azure Spring Apps 实例“概述”页面的导航窗格中,选择“日志”以检查应用的日志。

探索示例

使用以下步骤浏览示例:

  1. 请注意屏幕中心显示的已登录或注销状态。
  2. 选择角落中的上下文敏感按钮。 首次运行应用时,此按钮将 读取登录 。 或者,选择令牌详细信息管理员或普通用户。 由于这些页面受到保护并需要身份验证,因此会自动重定向到登录页。
  3. 在下一页上,按照说明使用 Microsoft Entra ID 租户中的帐户登录。
  4. 在同意屏幕上,请注意请求的范围。
  5. 成功完成登录流后,应重定向到主页(显示 登录状态 )或其他页面之一,具体取决于哪个按钮触发了登录流。
  6. 请注意,上下文敏感按钮现在显示 “注销 ”并显示用户名。
  7. 如果位于主页上,请选择“ID 令牌详细信息以查看一些 ID 令牌解码的声明,包括组。
  8. 选择“仅管理员”以查看 。/admin_only 只有属于 AdminGroup 安全组的用户才能查看此页面。 否则,会显示授权失败消息。
  9. 选择“常规用户以查看/regular_user页面。 只有属于 UserGroup 安全组的用户才能查看此页面。 否则,会显示授权失败消息。
  10. 使用角落中的按钮注销。状态页反映新状态。

关于代码

此示例演示如何使用 适用于 Java 的 Microsoft Entra ID Spring Boot Starter 客户端库将用户登录到 Microsoft Entra ID 租户。 此示例还使用 Spring Oauth2 客户端和 Spring Web 启动器。 此示例使用从 Microsoft Entra ID 获取的 ID 令牌中的声明来显示已登录用户的详细信息,以及通过使用组声明进行授权来限制对某些页面的访问。

目录

下表显示了示例项目文件夹的内容:

文件/文件夹 说明
pom.xml 应用程序依赖项。
src/main/resources/templates/ 用于 UI 的 Thymeleaf 模板。
src/main/resources/application.yml 应用程序和Microsoft Entra ID 启动程序库配置。
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ 此目录包含应用程序入口点、控制器和配置类。
.../MsIdentitySpringBootWebappApplication.java Main 类。
.../SampleController.java 具有终结点映射的控制器。
.../SecurityConfig.java 安全配置 - 例如,需要身份验证的路由。
.../Utilities.java 实用工具类 - 例如,筛选器 ID 令牌声明。
CHANGELOG.md 示例更改列表。
CONTRIBUTING.md 参与示例的指南。
许可证 示例的许可证。

ID 令牌声明

为了提取令牌详细信息,应用在请求映射中使用 Spring Security 和AuthenticationPrincipalOidcUser对象,如以下示例所示。 有关此应用如何使用 ID 令牌声明的完整详细信息,请参阅示例控制器

import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
    Map<String, Object> claims = principal.getIdToken().getClaims();
}

处理 ID 令牌中的组声明

令牌的组声明包括已登录用户分配到的组的名称,如以下示例所示:

{
  ...
  "groups": [
    "xyz-id-xyz",
    "xyz-id-xyz",]
  ...
}

ID 令牌声明部分中记录了访问组名称的常见方法。

Microsoft Entra ID Boot Starter v3.5 及更高版本自动分析组声明,并将每个组添加到已登录用户的 Authorities组。 通过此配置,开发人员可以使用此方法hasAuthority将组与 Spring PrePost 条件注释结合使用。 例如,可以在SampleController.java中找到以下@PreAuthorize条件

@GetMapping(path = "/admin_only")
@PreAuthorize("hasAuthority('enter-admin-group-id-here')")
public String adminOnly(Model model) {
    // restrict to users who belong to AdminGroup
}
@GetMapping(path = "/regular_user")
@PreAuthorize("hasAnyAuthority('enter-user-group-id-here','enter-admin-group-id-here')")
public String regularUser(Model model) {
    // restrict to users who belong to any of UserGroup or AdminGroup
}

以下代码获取给定用户颁发机构的完整列表:

@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
   Collection<? extends GrantedAuthority> authorities = principal.getAuthorities();
}

对于登录,应用向 Microsoft Entra ID 登录终结点发出请求,该终结点由 Microsoft适用于 Java 的 entra ID Spring Boot Starter 客户端库自动配置,如以下示例所示:

<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>

对于注销,应用向 logout 终结点发出 POST 请求,如以下示例所示:

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

依赖于身份验证的 UI 元素

该应用在 UI 模板页面中具有一些简单的逻辑,用于根据用户是否进行身份验证来确定要显示的内容,如以下示例中使用 Spring Security Thymeleaf 标记所示:

<div sec:authorize="isAuthenticated()">
  this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
  this content only shows to not-authenticated users
</div>

使用 AADWebSecurityConfigurerAdapter 保护路由

默认情况下,应用保护 ID 令牌详细信息仅限管理员和 常规用户 页面,以便只有登录用户可以访问它们。 应用使用app.protect.authenticatedapplication.yml文件中的属性配置这些路由。 若要配置应用的特定要求,可以在其中一个类中扩展 AADWebSecurityConfigurationAdapter 。 有关示例,请参阅此应用的 SecurityConfig 类,如以下代码所示:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends AADWebSecurityConfigurerAdapter{
  @Value( "${app.protect.authenticated}" )
  private String[] protectedRoutes;

    @Override
    public void configure(HttpSecurity http) throws Exception {
    // use required configuration form AADWebSecurityAdapter.configure:
    super.configure(http);
    // add custom configuration:
    http.authorizeRequests()
      .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details, /admin_only, /regular_user)
      .antMatchers("/**").permitAll();                  // allow all other routes.
    }
}

组超额声明

为了确保令牌大小不超过 HTTP 标头大小限制,Microsoft 标识平台限制它在组声明中包含的对象 ID 数。

对于 SAML 令牌,超额限制为 150,JWT 令牌为 200,对于单页应用程序为 6。 如果用户是超出超额限制的组的成员,则Microsoft 标识平台不会在令牌中的组声明中发出组 ID。 而是在令牌中包含一个超额声明,该声明指示应用程序查询Microsoft图形 API检索用户的组成员身份。

Microsoft Entra ID Boot Starter v3.5 及更高版本自动分析组声明,并将每个组添加到已登录用户的 Authorities组。 初学者会自动处理组超额方案。

注意

我们强烈建议你尽可能使用组筛选功能,以避免遇到组超额。 有关详细信息,请参阅“ 配置应用程序以从用户可能分配到的已筛选组组接收组声明值”部分。

创建超额方案进行测试

可以使用 AppCreationScripts 文件夹中提供的 BulkCreateGroups.ps1 文件创建大量组并向其分配用户。 此文件有助于在开发过程中测试超额方案。 请记住更改 BulkCreateGroups.ps1 脚本中提供的用户objectId

处理超额需要调用 Microsoft Graph 来读取已登录用户的组成员身份,因此你的应用需要具有 getMemberGroups 函数的 User.Read 和 GroupMember.Read.All 权限才能成功执行。

重要

对于超额方案,请确保已为客户端和服务应用Microsoft图形 API GroupMember.Read.All 的范围授予Admin Consent。 有关详细信息,请参阅本文前面的应用注册步骤。

更新 Microsoft Entra ID 应用注册(java-spring-webapp-groups)

若要更新应用注册,请使用以下步骤:

  1. 导航回到 Azure 门户

  2. 在导航窗格中,选择 Azure Active Directory,然后选择应用注册(预览版)。

  3. 在生成的屏幕中 java-spring-webapp-groups ,选择该应用程序。

  4. 在应用的注册页上,从菜单中选择“ 身份验证 ”。

  5. 在“重定向 URI”部分中,更新回复 URL 以匹配 Azure 部署的站点 URL,例如https://java-spring-webapp-groups.azurewebsites.net/login/oauth2/code/

重要

如果应用正在使用内存中存储,则如果网站处于非活动状态,Azure App 服务会关闭网站,并且应用保留的任何记录将被清空。 此外,如果增加网站的实例计数,请求将分布在实例之间。 因此,应用记录在每个实例上都不同。

详细信息

有关 OAuth 2.0 协议在此方案中的工作方式和其他方案的详细信息,请参阅 Microsoft Entra ID 的身份验证方案。