Рубрики
Без рубрики

Использование Spring Security с Azure Active Directory

В этом сообщении показано, как использовать Azure Spring Boot starter для Active Directory, чтобы защитить приложение Spring Boot с помощью Azure Active Directory и Spring Security OAuth2. Помечен как spring, azure, java, security.

Зачем использовать Active Directory?

Давайте будем честны, Active Directory сегодня не является “крутым”. Люди видят, что это очень сложно, и это правда, но безопасность – это сложный вопрос! И в нем нет шумихи вокруг новых продуктов, таких как Keycloak от Red Hat, даже если оба часто используются для одной и той же цели, по крайней мере, в Spring Boot: защита бизнес-приложения с помощью OpenID Connect.

Однако у Active Directory есть одна действительно приятная особенность: ваша компания, вероятно, уже установила ее и, вероятно, уже платит за нее (подсказка: за продукт безопасности вам лучше заплатить, если вам нужна поддержка и последние исправления – вот почему я всегда рекомендую платить за Keycloak!). Официально 85% компаний из списка Fortune 500 используют Active Directory, что на самом деле (неофициально!) подтверждено этим умным хакером .

Таким образом, защита приложения Spring Boot с помощью Active Directory имеет большой смысл:

  • Вероятно, он уже установлен, проверен и защищен в вашей компании
  • У вас будет доступ к официальному списку сотрудников вашей компании: не нужно создавать новых пользователей, обрабатывать потерянные пароли, аннулировать старых сотрудников…
  • Он очень защищен: у вас будет 2-факторная аутентификация и т.д., Все включено

Но есть и последняя причина: это бесплатно! Ну, не совсем бесплатно, но если вы посмотрите на модель ценообразования , есть очень щедрый бесплатный уровень. Таким образом, вы можете использовать его для разработки или для своей идеи стартапа, ничего не платя.

Средство начальной загрузки Azure Spring для Active Directory

К счастью, команда инженеров Azure предоставляет средство начальной загрузки Spring для Azure Active Directory, которое доступно по адресу https://github.com/microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-active-directory-spring-boot-starter . Доступны два официальных руководства:

  • Официальный учебник доступен здесь .
  • В репозитории project GitHub также есть учебное пособие, которое обновляется вместе с кодом: оно работает с последней версией кода и менее подробно, чем официальное.

Оба они немного устарели на момент написания этой статьи, и поскольку моя работа заключается в их обновлении, я сначала делаю этот пост в блоге, чтобы собрать отзывы:

  • Мы будем использовать последнюю и самую лучшую версию как Spring Boot (2.1.8, выпущенную несколько часов назад на момент написания этой статьи), так и Azure Spring Boot starters (2.1.7).
  • Мы будем использовать новый пользовательский интерфейс Active Directory: здесь возникает огромная проблема, поскольку все доступные в настоящее время скриншоты взяты из старого пользовательского интерфейса, поэтому вы не сможете легко найти что-либо

Пожалуйста, не стесняйтесь добавлять комментарии к этому сообщению в блоге, чтобы я мог все убрать и создать потрясающий официальный учебник!

Примерный проект

Пример проекта, который мы делаем здесь, доступен по адресу https://github.com/jdubois/spring-active-directory , так что, если вы хотите увидеть реальный код и протестировать его, все это есть.

Это проект Spring Boot, созданный с помощью Spring Initializr , поскольку я хотел иметь что-то чрезвычайно простое. В нем используются следующие важные компоненты:

  • Пружинная Паутина
  • Клиент OAuth2, который транзитивно включает Spring Security
  • Поддержка Azure
  • Spring Data JPA и MySQL, чтобы в будущем мы могли создать “настоящее” приложение

Настройка Active Directory

Теперь самая сложная часть этого поста! Настройка Active Directory сложна, поэтому мы рассмотрим ее шаг за шагом и предоставим скриншоты.

Создайте своего собственного арендатора

Active Directory предоставляет tenants , которые в основном являются экземплярами, которые вы можете использовать. Существует два типа экземпляров: work и school (тот, который я буду использовать здесь) и социальные учетные записи (называемые “Azure Active Directory B2C”).

Как обсуждалось ранее, существует щедрый бесплатный уровень, так что вы можете создать своего собственного арендатора, ничего не платя:

  • Перейдите на портал Azure
  • Выберите “Все ресурсы”, найдите “Azure Active Directory” и нажмите “Создать”.
  • Введите название вашей организации, домен и страну, и все готово!

Доступ к вашему клиенту Active Directory

Теперь вы можете переключиться на своего клиента Active Directory, нажав на значок “Каталог + подписка” в верхнем меню:

Настройка вашего клиента

Как только вы переключитесь на своего клиента, выберите “Active Directory”, и теперь вы можете настроить его с полными правами администратора. Вот что важно сделать.

Нажмите на “Регистрация приложений” и создайте новую регистрацию:

Пожалуйста, обратите внимание, что:

  • Тип учетной записи должен быть “multitenant”. Текущий Spring Boot starter не работает с отдельными арендаторами, что является проблемой, которая в настоящее время решается.
  • URI перенаправления должен быть ” http://localhost:8080/login/oauth2/code/azure “. Конечно, вы можете заменить “localhost: 8080” на свой собственный домен, но суффикс по умолчанию, который будет настроен Spring Boot starter, и если эти URI не совпадают, вы не сможете войти в систему.

Выберите зарегистрированное приложение

  • В разделе “Обзор” обратите внимание на “Приложение (клиент) Идентификатор”, это то, что будет использоваться в Spring Security как “идентификатор клиента”, а также “Идентификатор каталога (клиента)”, который будет “идентификатором клиента” Spring Security.
  • Выберите “Аутентификация” и в веб-разделе “Конфигурация платформы” проверьте оба параметра в разделе “Неявное предоставление” (“Токены доступа” и “Идентификационные токены”).

  • Нажмите на “Сертификаты и секреты” и создайте новый секрет клиента, который будет “клиентским секретом” Spring Security.

  • Нажмите на “Разрешения API” и в разделе “Microsoft Graph” укажите вашему приложению “Каталог.Доступ От Имени Пользователя. Все ” и “Пользователь. Читать” разрешения
  • Нажмите на кнопку “Предоставить согласие администратора” в нижней части страницы

Вернитесь к своему клиенту Active Directory и нажмите “Настройки пользователя”.

В разделе “Управление тем, как конечные пользователи запускают и просматривают свои приложения” убедитесь, что для параметра “Пользователи могут давать согласие на доступ приложений к данным компании от их имени” установлено значение “Да” (по умолчанию это должно быть хорошо).

Создание пользователей и групп

Все еще находясь в вашем клиенте Active Directory, выберите “Группы” и создайте новую группу, например “group1”.

Теперь выберите “Пользователи”, создайте нового пользователя и дайте этому пользователю группу “group1”, которую мы только что создали.

Настройте приложение Spring Boot

Теперь давайте используем этот настроенный клиент с этим новым пользователем в нашем приложении Spring Boot.

В pom.xml файл, добавьте azure-active-directory-spring-boot-starter/|:

        
            com.microsoft.azure
            azure-active-directory-spring-boot-starter
        

В вашем файле application.yml (или файле application.properties , если вам не нравится YAML) настройте следующие свойства. Пожалуйста, обратите внимание, что мы получили 3 обязательных значения, когда зарегистрировали наше приложение в нашем клиенте Active Directory.

azure:
  activedirectory:
    tenant-id: 
    active-directory-groups: group1, group2

spring:
  security:
    oauth2:
      client:
        registration:
          azure:
            client-id: 
            client-secret: 

Теперь нам нужно настроить наше приложение Spring Boot на использование Active Directory. Создайте новый Конфигурация безопасности класс:

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final OAuth2UserService oidcUserService;

    public SecurityConfiguration(OAuth2UserService oidcUserService) {
        this.oidcUserService = oidcUserService;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .oauth2Login()
                .userInfoEndpoint()
                .oidcUserService(oidcUserService);
    }
}

Эта конфигурация потребует, чтобы каждый запрос был защищен, и поэтому перенаправит любого пользователя в Active Directory, когда он попытается подключиться.

Управляет всем

При запуске приложения Spring Boot мы рекомендуем вам добавить src/main/resources/logback-spring.xmllogback-spring.xml файл со следующей конфигурацией, чтобы лучше понять проблемы, с которыми вы можете столкнуться:






    

    
    
    


Теперь, если вы запустите приложение, получите доступ к нему через http://localhost:8080 должен указать вам на Active Directory, где вы можете подписать его, используя пользователя, которого мы только что создали ранее:

Тестирование безопасности

Чтобы узнать, все ли правильно, в том числе действительно ли ваш пользователь получает роль “group1”, которую мы настроили ранее, давайте добавим конкретный контроллер Spring MVC с именем Ресурс учетной записи

package com.example.demo;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AccountResource {

    @GetMapping("/account")
    public Authentication getAccount() {
        return SecurityContextHolder.getContext().getAuthentication();
    }
}

Доступ к http://localhost:8080/account теперь должен предоставить вам всю информацию о безопасности пользователя, включая его роли! Поздравляем, вы защитили свое приложение Spring Boot с помощью Active Directory!

Оригинал: “https://dev.to/azure/using-spring-security-with-azure-active-directory-mga”