Azure-sdk-for-java: Поддержка Spring Boot 2.4 (обычно, но особенно для аутентификации AzureAD)

Созданный на 14 дек. 2020  ·  35Комментарии  ·  Источник: Azure/azure-sdk-for-java

Привет

Я обновляю свое приложение до Spring Boot 2.4.1, но, к сожалению, столкнулся с проблемой зависимости.

Я понизил версию библиотеки nimbus до 7.1 согласно другим сообщениям, но похоже, что сама безопасность Spring полагается на другую версию. Само по себе не было билета об этом, и хотелось посмотреть, есть ли простое решение, пока (над # 17808 или # 17986 работают). Я не был уверен, что # 17808 определенно решит проблему, но есть ли пока решение?

Соответствующие части из моих файлов pom:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/>
    </parent>

  <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-active-directory-spring-boot-starter</artifactId>
            <version>2.3.5</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-spring-boot-starter</artifactId>
            <version>2.3.5</version>
        </dependency>
        <!-- adding to ensure compatibility -->
        <dependency>
            <groupId>com.nimbusds</groupId>
            <artifactId>nimbus-jose-jwt</artifactId>
            <version>7.9</version>
        </dependency>

Приложение теперь запускается (не было без перехода на 7.9 nimbus), но теперь оно терпит неудачу в процессе аутентификации / авторизации:

java.lang.NoSuchMethodError: 'void com.nimbusds.jose.proc.JWSVerificationKeySelector.<init>(java.util.Set, com.nimbusds.jose.jwk.source.JWKSource)'
    at org.springframework.security.oauth2.jwt.NimbusJwtDecoder$JwkSetUriJwtDecoderBuilder.jwsKeySelector(NimbusJwtDecoder.java:333)
    at org.springframework.security.oauth2.jwt.NimbusJwtDecoder$JwkSetUriJwtDecoderBuilder.processor(NimbusJwtDecoder.java:348)
    at org.springframework.security.oauth2.jwt.NimbusJwtDecoder$JwkSetUriJwtDecoderBuilder.build(NimbusJwtDecoder.java:361)
    at org.springframework.security.oauth2.client.oidc.authentication.OidcIdTokenDecoderFactory.buildDecoder(OidcIdTokenDecoderFactory.java:167)
    at org.springframework.security.oauth2.client.oidc.authentication.OidcIdTokenDecoderFactory.lambda$createDecoder$3(OidcIdTokenDecoderFactory.java:129)
    at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
    at org.springframework.security.oauth2.client.oidc.authentication.OidcIdTokenDecoderFactory.createDecoder(OidcIdTokenDecoderFactory.java:128)
    at org.springframework.security.oauth2.client.oidc.authentication.OidcIdTokenDecoderFactory.createDecoder(OidcIdTokenDecoderFactory.java:66)
    at org.springframework.security.oauth2.client.oidc.authentication.OidcAuthorizationCodeAuthenticationProvider.createOidcToken(OidcAuthorizationCodeAuthenticationProvider.java:235)
    at org.springframework.security.oauth2.client.oidc.authentication.OidcAuthorizationCodeAuthenticationProvider.authenticate(OidcAuthorizationCodeAuthenticationProvider.java:154)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)
    at org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter.attemptAuthentication(OAuth2LoginAuthenticationFilter.java:192)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:222)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter.doFilterInternal(OAuth2AuthorizationRequestRedirectFilter.java:178)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:141)
    at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:829)
Client azure-spring azure-spring-aad customer-reported question

Самый полезный комментарий

Ядро реактора 3.4.3 теперь доступно.

Все 35 Комментарий

Привет, @chrisburrell , теперь azure-spring-boot-starter не поддерживает spring-boot-2.4.x, не могли бы вы сейчас использовать spring-boot2.3.5?

После объединения https://github.com/Azure/azure-sdk-for-java/pull/17808 мы выпустим новую версию GA, и проблема будет устранена.

Следующая версия GA выйдет до конца 2021 г.

@chenrujun в качестве билета, который вы упомянули, вероятно, недействителен (эти версии несовместимы), есть ли у вас обходной путь, как использовать spring -boot 2.4.x с лазурной весенней загрузкой (в настоящее время мы используем azure-spring-boot-bom 2.3 .5)?

@bilak , мы только что выпустили 3.0.0 , попробуйте следующее:

       <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>azure-spring-boot-starter-active-directory</artifactId>
            <version>3.0.0</version>
        </dependency>

3.0.0 is прежнему работают для весенней загрузки 2.2 - 2.3.

Мы выпустим 3.2.0 для spring -boot 2.4.x до конца этого месяца, вы можете дождаться релиза.

Ссылки: https://repo.maven.apache.org/maven2/com/azure/spring/azure-spring-boot-starter-active-directory/

@chenrujun Я только что написал об этом вопросе, потому что он имеет название "
И дело не только в библиотеке активных каталогов.

@bilak

Извините, что мы столкнулись с проблемой при обновлении до весенней загрузки 2.4.0.
Ссылки: https://github.com/Azure/azure-sdk-for-java/pull/17905

Вы можете выбрать один из вариантов:

  1. Попробуйте azure-spring-boot-starter-active-directory 3.0.0 , проверьте, хорошо ли он работает с Spring-boot 2.4.
  2. Ждите следующего релиза. в этом месяце мы выпустим azure-spring-boot-starter-xxx 3.2.0 . который работает для весенней загрузки 2.4.

Привет,

azure-spring-boot-starter-active-directory 3.0.0 тоже не работает ...
Вы - мой последний шаг к тому, чтобы в продукте была готовая реактивная версия :-)

С наилучшими пожеланиями,

Привет, @Tcharl .

Вы - мой последний шаг к тому, чтобы в продукте была готовая реактивная версия :-)

Вы имеете в виду, что используете Интернет в реактивном стеке ? В настоящее время мы не поддерживаем реагирование для наших стартеров.

Однако мне удалось использовать spring-boot-oauth2-client вместо выделенной библиотеки azad (какова добавленная стоимость библиотеки Microsoft?). App Insight sdk - последний проблемный ...

@Tcharl

в чем добавленная стоимость от Microsoft?

Мы поддерживаем другие функции, такие как:

  1. Авторизуйте несколько авторизованных клиентов за один раз.
  2. Поддержка согласия по запросу.
  3. Подтвердите эмитента и аудиторию в JWT.
  4. Поддержка от имени потока.
    так далее..

Ссылки:

  1. https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-starter-active-directory#web -app-Authenticate-in-web-app
  2. https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-samples/azure-spring-boot-sample-active-directory-webapp
  3. https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-samples/azure-spring-boot-sample-active-directory-resource-server

+1 по этому поводу. Spring Boot 2.4.2 с Azure SDK приводит к следующему исключению classnotfound (версия oidc, используемая в Azure, слишком старая):

2021-01-25, 07:30:36 ERROR java.lang.ClassNotFoundException: com.nimbusds.oauth2.sdk.http.CommonContentTypes
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at com.microsoft.aad.adal4j.AdalTokenRequest.toOAuthRequest(AdalTokenRequest.java:158)
    at com.microsoft.aad.adal4j.AdalTokenRequest.executeOAuthRequestAndProcessResponse(AdalTokenRequest.java:86)
    at com.microsoft.aad.adal4j.AuthenticationContext.acquireTokenCommon(AuthenticationContext.java:930)
    at com.microsoft.aad.adal4j.AcquireTokenCallable.execute(AcquireTokenCallable.java:70)
    at com.microsoft.aad.adal4j.AcquireTokenCallable.execute(AcquireTokenCallable.java:38)
    at com.microsoft.aad.adal4j.AdalCallable.call(AdalCallable.java:47)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

Пожалуйста, обновите следующие зависимости:

      <dependency>
        <groupId>com.nimbusds</groupId>
        <artifactId>oauth2-oidc-sdk</artifactId>
        <version>${oauth2-oidc-sdk.version}</version>
      </dependency>
      <dependency>
        <groupId>com.nimbusds</groupId>
        <artifactId>nimbus-jose-jwt</artifactId>
        <version>${nimbus-jose-jwt.version}</version>
      </dependency>

Получил работу, используя следующие версии: (в этом случае работают как spring oauth2, так и Azure SDK)

<microsoft-azure.version>1.38.1</microsoft-azure.version>
<nimbus-jose-jwt.version>9.4.1</nimbus-jose-jwt.version>
<oauth2-oidc-sdk.version>7.5</oauth2-oidc-sdk.version>
<spring.boot.version>2.4.2</spring.boot.version>

oauth2-oidc-sdk больше или равно 8.x не работает.

Надеюсь, вы, ребята, обновите это быстро, так как это грязный хак / сложно поддерживать несоответствия в зависимостях maven.

@jloisel .
Мы работаем над этим. Подождите, пока выйдет следующий выпуск.
Ссылки: https://github.com/Azure/azure-sdk-for-java/blob/feature/core/reactorupgrade/eng/versioning/external_dependencies.txt#L224

Спасибо! Вы можете перейти на Spring Boot 2.4.2 , Nimbus 9.4.1 и oidc 8.34.2 . Ваши "обновленные" зависимости уже устарели.

@jloisel
Спасибо за информацию.

Ваши "обновленные" зависимости уже устарели.

Это просто обновление версии патча. Нам легко обновить версию патча.

@chenrujun есть новости о выпуске, совместимом с весенней загрузкой 2.4.x?

@bilak

Если все пойдет хорошо, мы выпустим новую версию, совместимую с spring -boot 2.4.x, в конце этого месяца.

Вот подробности:

  1. При обновлении до Spring-boot 2.4.x мы обнаружили ошибку netty: https://github.com/reactor/reactor-core/issues/2579
  2. Нам нужно подождать следующего релиза netty. Вот веха netty: https://github.com/reactor/reactor-core/milestone/97?closed=1

Ядро реактора 3.4.3 теперь доступно.

@jloisel
Спасибо за информацию.

В этом месяце завершился регулярный выпуск некоторых модулей в этом репозитории.
Чтобы модули использовали одну и ту же версию, со следующего месяца можно использовать реактор-ядро 3.4.x.

Таким образом, мы не сможем поддерживать spring-boot 2.4.x до регулярного выпуска в следующем месяце.
Пожалуйста, подождите.
Извините за доставленные неприятности.

@chenrujun, так что у нас следующий месяц, пожалуйста, каков статус? Мы будем ждать следующего месяца? : D

@bilak
Текущий план заключается в том, что мы выпустим azure-spring-boot-starter-active-directory:3.3.0 до 2021-03-11, что будет работать с spring-boot:2.4.3

@chenrujun как насчет других библиотек? azure-spring-boot-bom основном.

@bilak будут выпущены и другие библиотеки. Для пружинного башмака 2.4.

Привет, @chenrujun ,

@raniemi , мартовский выпуск.

Закрытие этой проблемы, поскольку выпущена версия 3.3.0, которая поддерживает Spring- boot: 2.4.3.

Это не решено, поскольку другие лазурные артефакты полагаются на adal4j:
https://mvnrepository.com/artifact/com.microsoft.azure/adal4j/1.6.6

Что, в свою очередь, все еще зависит от старой версии oauth2-oidc-sdk . Конфликт зависимостей по-прежнему сохраняется, если вы пытаетесь использовать клиент Azure в приложении с весенней загрузкой.

@jloisel

Извините, я не могу понять вашу точку зрения.
Не могли бы вы проверить наш образец проекта ?

  1. Это не зависит от adal4j:
    image

  2. По поводу oauth2-oidc-sdk конфликта нет:
    image

  3. То же, что и nimbus-jose-jwt:
    image

Автономный клиент Azure по-прежнему зависит от него:
https://mvnrepository.com/artifact/com.microsoft.azure/adal4j/1.6.4/usages?p=1

Мы используем клиент Azure:

      <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure</artifactId>
        <version>1.40.0</version>
      </dependency>

И он по-прежнему транзитивно зависит от adal4j, который, в свою очередь, зависит от старых версий oidc и nimbus.

Простой поиск показывает, что в разных местах все еще есть код, зависящий от adal4j:
https://github.com/Azure/azure-sdk-for-java/search?q=adal4j

Я потратил некоторое время, пытаясь понять, какую зависимость использовать для запуска / остановки виртуальных машин в Azure, но это действительно озадачивает, учитывая, сколько существует артефактов. В руководстве по миграции также не указано, какие зависимости использовать, он просто содержит некоторый код.

РЕДАКТИРОВАТЬ: нашел несколько образцов:
https://github.com/Azure-Samples/compute-java-manage-vm/blob/master/src/main/java/com/azure/resourcemanager/compute/samples/ManageVirtualMachine.java

Похоже, нам нужно использовать клиент 2.x.

Привет @jloisel

Почему вы используете com.microsoft.azure:azure ? Я имею в виду, для чего вы его используете?
Я думаю, вам следует использовать com.azure.resour cemanager: xxx .

Похоже, нам нужно использовать клиент 2.x.

Вы имеете в виду, что теперь хотите использовать com.azure.resourcemanager:xxx ?

Привет,

Мы думали, что это правильный клиент, но ошибались. Я перенес нашу кодовую базу, чтобы использовать azure-resourcemanager-compute вместе с azure-identity .

Мы используем клиент Azure для автоматического запуска / остановки экземпляров в Azure в зависимости от потребностей клиента.

Мы используем клиент Azure для автоматического запуска / остановки экземпляров в Azure в зависимости от потребностей клиента.

Привет, @saragluna .
ИДУ,
azure - библиотека дорожки 1,
нам следует избегать использования библиотеки трека 1.

Есть ли у нас библиотека дорожки 2 для запуска / остановки экземпляров в Azure?

@jloisel

Мы используем клиент Azure для запуска / остановки экземпляров в Azure

Azure client вы говорили, относится к библиотеке azure-resourcemanager-compute ?

До сих пор мы использовали библиотеку трека 1. Вот почему у нас были проблемы с конфликтами nimbus / oidc при загрузке Spring:

<strong i="6">@Override</strong>
  public AzureClient newClient(final AzureAccount account) {
    final ApplicationTokenCredentials credentials = new ApplicationTokenCredentials(
      account.getClientId(),
      account.getTenantId(),
      account.getClientSecret(),
      ENVS.getOrDefault(account.getEnvironment(), AZURE));

    final Authenticated auth = Azure.authenticate(credentials);

    final Azure c = auth.withSubscription(account.getSubscriptionId());
    return new ImmutableAzureClient(
      c.disks(),
      c.networks(),
      c.virtualMachines(),
      c.publicIPAddresses(),
      c.networkInterfaces(),
      c.galleries()
    );

Теперь мы используем клиент трека 2:

<strong i="10">@Override</strong>
  public AzureClient newClient(final AzureAccount acc) {
    final TokenCredential credential = new ClientSecretCredentialBuilder()
      .clientId(acc.getClientId())
      .clientSecret(acc.getClientSecret())
      .tenantId(acc.getTenantId())
      .build();
    final AzureEnvironment env = ENVS.getOrDefault(acc.getEnvironment(), AZURE);
    final AzureProfile profile = new AzureProfile(acc.getTenantId(), acc.getSubscriptionId(), env);

    final ComputeManager compute = ComputeManager
      .configure()
      .withLogLevel(BASIC)
      .authenticate(credential, profile);

    final NetworkManager network = NetworkManager
      .configure()
      .withLogLevel(BASIC)
      .authenticate(credential, profile);

    return new ImmutableAzureClient(
      compute.disks(),
      network.networks(),
      compute.virtualMachines(),
      network.publicIpAddresses(),
      network.networkInterfaces(),
      compute.galleries()
    );

Мы перешли от использования azure артефакта azure-resourcemanager-compute библиотеки.

@jloisel
Возникли ли у вас проблемы после использования библиотеки трека 2?

Теперь он работает нормально. : +1:

Была ли эта страница полезной?
0 / 5 - 0 рейтинги