Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано веб-приложение на Java Spring Boot, которое выполняет вход пользователей в вашем клиенте Microsoft Entra ID с помощью клиентской библиотеки Microsoft Entra ID Spring Boot Starter для Java. Он использует протокол OpenID Connect.
На следующей схеме показана топология приложения:
Клиентское приложение использует клиентскую библиотеку Microsoft Entra ID Spring Boot Starter для Java для входа пользователя в систему и получения токена идентификации от Microsoft Entra ID. Маркер идентификатора подтверждает, что пользователь проходит проверку подлинности с помощью идентификатора Microsoft Entra и позволяет пользователю получить доступ к защищенным маршрутам.
Предварительные требования
- JDK версии 17. Этот пример был разработан в системе с Java 17, но он может быть совместим с другими версиями.
- Maven 3
- Для запуска этого примера в Visual Studio Code рекомендуется пакет расширений Java для Visual Studio Code.
- Клиент идентификатора Microsoft Entra. Дополнительные сведения см. в статье Как получить арендатор Microsoft Entra ID.
- Учетная запись пользователя в клиенте Идентификатора Microsoft Entra. Этот пример не работает с личной учетной записью Майкрософт. Таким образом, если вы вошли на портал Azure с помощью личной учетной записи и у вас нет учетной записи пользователя в вашем каталоге, вам необходимо создать ее сейчас.
- Visual Studio Code
- Инструменты Azure для Visual Studio Code
Рекомендации
- Некоторое знакомство с Spring Framework.
- Некоторые знания о терминале Linux/OSX.
- jwt.ms для проверки ваших токенов.
- Fiddler для мониторинга сетевой активности и устранения неполадок.
- Следите за блогом Microsoft Entra, чтобы быть в курсе последних новостей.
Настройка примера
В следующих разделах показано, как настроить пример приложения.
Клонирование или скачивание примера репозитория
Чтобы клонировать пример, откройте окно Bash и выполните следующую команду:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in
Кроме того, перейдите в репозиторий ms-identity-msal-java-samples, затем скачайте его в виде файла .zip и распакуйте на жесткий диск.
Внимание
Чтобы избежать ограничений длины пути в Windows, рекомендуется клонировать в каталог рядом с корнем диска.
Регистрация примеров приложений в клиенте Идентификатора Microsoft Entra
В этом примере есть один проект. В следующих разделах показано, как зарегистрировать приложение с помощью портал Azure.
Выберите клиент Идентификатора Microsoft Entra, в котором вы хотите создать приложения
Чтобы выбрать арендатора, выполните следующие действия:
Войдите на портал Azure.
Если ваша учетная запись связана более чем с одним арендатором Microsoft Entra ID, выберите свой профиль в углу портала Azure, а затем выберите Switch directory, чтобы переключить сеанс на нужный арендатор Microsoft Entra ID.
Регистрация приложения (java-spring-webapp-auth)
Чтобы зарегистрировать приложение, выполните следующие действия.
Перейдите на портал Azure и выберите Microsoft Entra ID.
Выберите Регистрация приложений на панели навигации, а затем выберите Создать регистрацию.
На появившейся странице Регистрация приложения введите следующие сведения для регистрации приложения:
- В разделе Name введите осмысленное название приложения, которое будет отображаться пользователям приложения, — например,
java-spring-webapp-auth. - В разделе "Поддерживаемые типы учетных записей" выберите только один клиент — TENANT_NAME (
TENANT_NAMEзависит от клиента). - В разделе URI перенаправления (необязательно) выберите Web в раскрывающемся списке и введите следующий URI перенаправления:
http://localhost:8080/login/oauth2/code/
- В разделе Name введите осмысленное название приложения, которое будет отображаться пользователям приложения, — например,
Выберите Зарегистрировать, чтобы создать приложение.
На странице регистрации приложения найдите и скопируйте значение идентификатора приложения (клиента), которое будет использоваться позже. Это значение используется в файле конфигурации или файлах приложения.
На странице регистрации приложения выберите сертификаты и секреты на панели навигации, чтобы открыть страницу, где можно создать секреты и отправить сертификаты.
В разделе Секреты клиента выберите Создать секрет клиента.
Введите описание — например, секрет приложения.
Выберите одну из доступных продолжительности: рекомендуется: 180 дней (6 месяцев),90 дней (3 месяца),365 дней (12 месяцев),545 дней (18 месяцев) или 730 дней (24 месяца).
Выберите Добавить. Отображается созданное значение.
Скопируйте и сохраните созданное значение для использования в последующих шагах. Это значение требуется для файлов конфигурации кода. Это значение не отображается снова, и его нельзя получить другими средствами. Поэтому не забудьте сохранить его на портале Azure, прежде чем переходить к любому другому экрану или области.
Настройте приложение (java-spring-webapp-auth) для использования вашей регистрации приложения
Чтобы настроить приложение, выполните следующие действия.
Примечание.
В следующих шагах ClientID означает то же, что и Application ID или AppId.
Откройте проект в интегрированной среде разработки.
Откройте файл src\main\resources\application.yml.
Найдите заполнитель
Enter_Your_Tenant_ID_Hereи замените текущее значение на идентификатор клиента Microsoft Entra.Найдите заполнитель
Enter_Your_Client_ID_Hereи замените существующее значение идентификатором приложенияjava-spring-webapp-authилиclientId, скопированным на портале Azure.Найдите заполнитель
Enter_Your_Client_Secret_Hereи замените существующее значение на значение, которое вы сохранили при созданииjava-spring-webapp-authи скопировали из портала Azure.
Запустите пример
В следующих разделах описано, как развернуть пример в Контейнеры приложений Azure.
Предварительные требования
- Учетная запись Azure. Если у вас ее нет, создайте бесплатную учетную запись. Вам потребуется доступ
ContributorилиOwnerк подписке Azure. Дополнительные сведения см. в статье Назначение ролей Azure с помощью портала Azure. - Azure CLI.
- Расширение CLI Контейнеры приложений Azure версии
0.3.47или более поздней. Чтобы установить последнюю версию, используйте командуaz extension add --name containerapp --upgrade --allow-preview. - Комплект средств разработки Java, версии 17 или выше.
- Maven.
Подготовка проекта Spring
Чтобы подготовить проект, выполните следующие действия.
Используйте следующую команду Maven, чтобы собрать проект:
mvn clean verifyЗапустите пример проекта локально с помощью следующей команды:
mvn spring-boot:run
Настройка
Чтобы войти в Azure из ИНТЕРФЕЙСА командной строки, выполните следующую команду и следуйте инструкциям, чтобы завершить процесс проверки подлинности.
az login
Чтобы убедиться, что вы используете последнюю версию интерфейса командной строки, выполните команду обновления.
az upgrade
Затем установите или обновите расширение "Приложения контейнеров Azure" для интерфейса командной строки.
Если при выполнении команд az containerapp в Azure CLI возникают ошибки из-за отсутствующих параметров, убедитесь, что у вас установлена последняя версия расширения Контейнеры приложений Azure.
az extension add --name containerapp --upgrade
Примечание.
Начиная с мая 2024 г. расширения Azure CLI больше не поддерживают предварительные версии функций по умолчанию. Чтобы получить доступ к функциям предварительной версии Container Apps, установите расширение Container Apps с помощью --allow-preview true.
az extension add --name containerapp --upgrade --allow-preview true
Теперь, когда установлено текущее расширение или модуль, зарегистрируйте пространства имен Microsoft.App и Microsoft.OperationalInsights.
Примечание.
Ресурсы Контейнеры приложений Azure были перенесены из пространства имен Microsoft.Web в пространство имен Microsoft.App. Дополнительные сведения см. в разделе Миграция пространства имен из Microsoft.Web в Microsoft.App в марте 2022 г..
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Создайте среду приложений-контейнеров Azure
После завершения настройки Azure CLI вы можете определить переменные среды, которые используются в этой статье.
Определите следующие переменные в оболочке Bash.
export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"
Создать группу ресурсов.
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION \
Создайте среду с автоматически созданной рабочей областью Log Analytics.
az containerapp env create \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
Отображение домена по умолчанию среды приложения контейнера. Запишите этот домен для использования в последующих разделах.
az containerapp env show \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--query properties.defaultDomain
Подготовка приложения к развертыванию
При развертывании приложения в приложениях контейнеров Azure URL-адрес перенаправления изменяется на URL-адрес перенаправления развернутого экземпляра приложения в приложениях контейнеров Azure. Чтобы изменить эти параметры в файле application.yml , выполните следующие действия.
Перейдите к файлу src\main\resources\application.yml вашего приложения и измените значение
post-logout-redirect-uriна доменное имя развернутого приложения, как показано в следующем примере. Обязательно замените<API_NAME>и<default-domain-of-container-app-environment>своими реальными значениями. Например, с доменом по умолчанию для вашей среды Azure Container Apps из предыдущего шага иms-identity-apiв качестве имени приложения вы бы использовалиhttps://ms-identity-api.<default-domain>в качестве значенияpost-logout-redirect-uri.post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>После сохранения этого файла используйте следующую команду, чтобы перестроить приложение:
mvn clean package
Внимание
В файле приложения application.yml сейчас содержится значение клиентского секрета в параметре client-secret. Не рекомендуется хранить это значение в этом файле. Вы также можете подвергнуть себя риску, если закоммитите файл в репозиторий Git. Сведения о рекомендуемом подходе см. в статье Управление секретами в Контейнеры приложений Azure.
Обновите свою регистрационную запись приложения Microsoft Entra ID
Поскольку URI перенаправления меняется на URI вашего приложения, развернутого в Контейнеры приложений Azure, вам также нужно изменить URI перенаправления в регистрации приложения Microsoft Entra ID. Чтобы внести это изменение, выполните следующие действия:
Перейдите на страницу Регистрация приложений платформы Microsoft identity для разработчиков.
Используйте поле поиска, чтобы найти регистрацию вашего приложения, — например,
java-servlet-webapp-authentication.Откройте регистрацию приложения, выбрав его имя.
Выберите Проверка подлинности в меню.
В разделе Web - URI перенаправления выберите Добавить URI.
Укажите URI приложения, добавив в конец
/login/oauth2/code/— например,https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/.Выберите Сохранить.
Развертывание приложения
Разверните пакет JAR в Контейнеры приложений Azure.
Примечание.
При необходимости можно указать версию JDK в переменных среды сборки Java. Дополнительные сведения см. в статье Переменные среды сборки для Java в Контейнерных приложениях Azure.
Теперь вы можете развернуть WAR-файл с помощью команды CLI az containerapp up.
az containerapp up \
--name $API_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--environment $ENVIRONMENT \
--artifact <JAR_FILE_PATH_AND_NAME> \
--ingress external \
--target-port 8080 \
--query properties.configuration.ingress.fqdn
Примечание.
Версия JDK по умолчанию — 17. Если вам нужно изменить версию JDK для обеспечения совместимости с вашим приложением, вы можете использовать аргумент --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION>, чтобы изменить номер версии.
Дополнительные сведения о переменных среды сборки см. в статье Переменные среды сборки для Java в Контейнеры приложений Azure.
Проверка приложения
В этом примере команда containerapp up содержит аргумент --query properties.configuration.ingress.fqdn, который возвращает полное доменное имя (FQDN), также известное как URL приложения. Выполните следующие действия, чтобы проверить журналы приложения, чтобы изучить любую проблему развертывания:
Получите URL-адрес выходного приложения на странице Outputs раздела Deployment.
В области навигации на странице Overview экземпляра Контейнеры приложений Azure выберите Logs, чтобы просмотреть журналы приложения.
Анализ примера
Чтобы изучить пример, выполните следующие действия.
- Обратите внимание, что состояние входа или выхода отображается в центре экрана.
- Выберите контекстно-зависимую кнопку в углу. На этой кнопке отображается Войти при первом запуске приложения. Либо выберите сведения о токене. Так как эта страница защищена и требует проверки подлинности, вы автоматически перенаправляетесь на страницу входа.
- На следующей странице следуйте инструкциям и войдите, используя учетную запись клиента Microsoft Entra ID.
- На экране согласия обратите внимание на запрашиваемые области.
- После успешного завершения процесса входа вы должны быть перенаправлены на главную страницу, где отображается статус входа, или на страницу сведений о токене — в зависимости от того, какая кнопка запустила процесс входа.
- Обратите внимание, что контекстно-зависимая кнопка теперь показывает Выйти и отображает ваше имя пользователя.
- Если вы находитесь на главной странице, выберите Сведения о токене идентификации, чтобы просмотреть некоторые декодированные утверждения токена идентификации.
- Нажмите кнопку в углу, чтобы выйти из нее. Страница состояния отражает новое состояние.
О коде
В этом примере показано, как использовать клиентскую библиотеку Microsoft Entra ID Spring Boot Starter для Java для входа пользователей в ваш арендатор Microsoft Entra ID. Этот пример также использует стартеры Spring Boot Spring OAuth2 Client и Spring Web. В примере используются утверждения из токена ID, полученного от Microsoft Entra ID, для отображения сведений о вошедшем пользователе.
Содержимое
В следующей таблице показано содержимое папки примера проекта:
| Файл или папка | Описание |
|---|---|
| pom.xml | Зависимости приложений. |
| src/main/resources/templates/ | Шаблоны Thymeleaf для пользовательского интерфейса. |
| src/main/resources/application.yml | Конфигурация библиотеки Boot Starter для приложения и Microsoft Entra ID. |
| src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ | Этот каталог содержит основные классы входа приложения, контроллера и конфигурации. |
| .../MsIdentitySpringBootWebappApplication.java | Основной класс. |
| .../SampleController.java | Контроллер с сопоставлениями конечных точек. |
| .../SecurityConfig.java | Конфигурация безопасности— например, маршруты, для которых требуется проверка подлинности. |
| .../Utilities.java | Вспомогательный класс — например, для фильтрации утверждений токена ID. |
| CHANGELOG.md | Список изменений в примере. |
| CONTRIBUTING.md | Рекомендации по участию в образце. |
| ЛИЦЕНЗИЯ | Лицензия для примера. |
Утверждения токена идентификации
Чтобы извлечь сведения о токене, приложение использует объекты Spring Security AuthenticationPrincipal и OidcUser в обработчике запроса, как показано в следующем примере. Полные сведения о том, как это приложение использует утверждения токена идентификации, см. в примере контроллера.
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();
}
Ссылки на вход и выход
Для входа приложение отправляет запрос на конечную точку входа в систему Microsoft Entra ID автоматически, настроенную клиентской библиотекой Microsoft Entra ID Spring Boot Starter для Java, как показано в следующем примере:
<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>
При выходе из системы приложение отправляет POST-запрос к конечной точке logout, как показано в следующем примере:
<form action="#" th:action="@{/logout}" method="post">
<input class="btn btn-warning" type="submit" value="Sign Out" />
</form>
Элементы пользовательского интерфейса, зависящие от проверки подлинности
Приложение имеет простую логику на страницах шаблона пользовательского интерфейса для определения содержимого, отображаемого на основе проверки подлинности пользователя, как показано в следующем примере с помощью тегов 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 Token Details, так что доступ к ней имеют только пользователи, вошедшие в систему. Приложение настраивает эти маршруты с помощью свойства app.protect.authenticated из файла application.yml. Чтобы настроить требования, характерные для вашего приложения, примените метод AadWebApplicationHttpSecurityConfigurer#aadWebApplication к экземпляру HttpSecurity. В качестве примера см. класс SecurityConfig этого приложения, показанный в следующем коде:
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
@Value("${app.protect.authenticated}")
private String[] allowedOrigins;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.authorizeHttpRequests(auth -> auth
.requestMatchers(allowedOrigins).authenticated()
.anyRequest().permitAll()
);
// @formatter:on
return http.build();
}
@Bean
@RequestScope
public ServletUriComponentsBuilder urlBuilder() {
return ServletUriComponentsBuilder.fromCurrentRequest();
}
}
Дополнительные сведения
- платформа идентификации Microsoft (Microsoft Entra ID для разработчиков)
- Обзор библиотеки аутентификации Microsoft (MSAL)
- Краткое руководство. Регистрация приложения на платформе идентификации Майкрософт
- Краткое руководство: настройка клиентского приложения для доступа к веб-API
- Общие сведения о согласии для приложений в Microsoft Entra ID
- Понимание согласия пользователя и администратора
- Сведения об объектах приложения и субъекта-службы в Microsoft Entra ID
- Национальные облака
- Примеры кода MSAL
- Клиентская библиотека Spring Boot Starter для Microsoft Entra ID на Java
- Библиотека аутентификации Microsoft для Java (MSAL4J)
- Вики MSAL4J
- Токены идентификации
- Токены доступа на платформе удостоверений Майкрософт
Дополнительные сведения о том, как работают протоколы OAuth 2.0 в этом и других сценариях, см. в разделе Сценарии проверки подлинности для Microsoft Entra ID.