Spring Boot AzureAD фильтр автоконфигурация - PullRequest
0 голосов
/ 26 марта 2020

Я несколько дней go Мне удалось настроить интеграцию с Azure AD и весенней загрузкой. Для этого я использую следующие зависимости:

<dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-active-directory-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>msal4j</artifactId>
        </dependency>
</dependencies>

Это работает так хорошо, и я смог получить ожидаемый результат, но теперь проблема. У меня есть настройки безопасности. Каждый из них настроен с помощью пружинных профилей, например:

spring:
  profiles:
    active: DDBBSecurized, local

Этот параметр обеспечивает успех с DDBB, и он был настроен до интеграции с AzureAD. Он отлично работает

У меня также есть

spring:
  profiles:
    active: ADDSecurized, local

, который включает интеграцию azure AD.

Перед настройкой интеграции Azure AD, если я использую DDBBSecurized, она работает хорошо, и у меня также была возможность, что если я не настрою anyThing , spring.profiles.active: local, например, отключает защиту:

способ достижения этого заключается в следующем:

@EnableWebSecurity
@Profile( "DDBBSecurized" )
public class DDBBSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private RestAuthenticationExceptionHandler restAuthenticationExceptionHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable().sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS );
        http.headers().frameOptions().disable();

        //Filtro de autenticacion de peticiones
        http.addFilterAfter( new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class );

        //Filtros CORS
        http.addFilterBefore( new CorsFilter(), ChannelProcessingFilter.class );

        //Manejador de excpeciones de login
        http.exceptionHandling().authenticationEntryPoint( restAuthenticationExceptionHandler );

        //Configuracion Endpoints
        http.authorizeRequests().antMatchers( HttpMethod.POST, "/auth/login**" ).permitAll()
            .antMatchers( "/v2/api-docs", "/configuration/**","/swagger*/**","/webjars/**" ).permitAll()
            .antMatchers( "/actuator/**" ).permitAll()
            .anyRequest().authenticated();
    }
}

У меня есть собственный фильтр JWT и конечная точка входа в систему и У меня также было:

@EnableWebSecurity
@Profile( "!DDBBSecurized & !AzureAdSecurized" )
public class NonSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private RestAuthenticationExceptionHandler restAuthenticationExceptionHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable().sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS );
        http.headers().frameOptions().disable();

        //Filtros CORS
        http.addFilterBefore( new CorsFilter(), ChannelProcessingFilter.class );

        //Manejador de excpeciones de login
        http.exceptionHandling().authenticationEntryPoint( restAuthenticationExceptionHandler );

        //Configuracion Endpoints
        http.authorizeRequests().anyRequest().permitAll();
    }
}

Это работает отлично.

Теперь, если я использую ADDSecurized, все работает отлично.

@EnableWebSecurity
@Profile("AzureAdSecurized")
public class AzureSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private RestAuthenticationExceptionHandler restAuthenticationExceptionHandler;

    @Autowired
    private AADAppRoleStatelessAuthenticationFilter aadAuthenticationFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable().sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS );
        http.headers().frameOptions().disable();

        //Filtro de autenticacion de peticiones
        http.addFilterAfter( aadAuthenticationFilter, UsernamePasswordAuthenticationFilter.class );
        http.addFilterAfter( new AzureTokenGetFilter(), UsernamePasswordAuthenticationFilter.class );

        //Filtros CORS
        http.addFilterBefore( new CorsFilter(), ChannelProcessingFilter.class );

        //Manejador de excpeciones de login
        http.exceptionHandling().authenticationEntryPoint( restAuthenticationExceptionHandler );

        //Configuracion Endpoints
        http.authorizeRequests().antMatchers( HttpMethod.POST,  "/auth/login**" ).permitAll()
            .antMatchers( "/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**" ).permitAll()
            .antMatchers( "/actuator/**" ).permitAll().anyRequest().authenticated();
    }
}

Но если я перехожу на DDBBSecurized профиль, это все еще передавая фильтр aadAuthenticationFilter azure. даже если эта конфигурация отключена. Кажется, это его автоконфигурация и WebSecurityAdpater по своему или что-то в этом роде.

У меня также есть следующие свойства:

security:
    oauth2:
      client:
        registration:
          azure:
            client-id: XXXX-XXXX-XXXX-XXXX-XXXXXXXX

azure:
  activedirectory:
    tenant-id: XXXX-XXXX-XXXX-XXXX-XXXXXXXX
    client-id: XXXX-XXXX-XXXX-XXXX-XXXXXXXX
    scope: /User.Read
    session-stateless: true
    authority-url: https://login.microsoftonline.com/

Теперь, например, я настроил DDBBSecurized И я вижу в журнале что фильтр применяется:

STARTUPLOG:

2020-03-26 20:10:02,279 INFO class=org.springframework.boot.StartupInfoLogger  Starting Application on gggarrido10 with PID 8760 (D:\Proyectos\EvoSago\SOM-Back\admin-user\target\classes started by gggarrido in D:\Proyectos\EvoSago\SOM-Back)
2020-03-26 20:10:11,378 INFO class=org.springframework.boot.SpringApplication  The following profiles are active: DDBBSecurized,local
2020-03-26 20:10:31,479 INFO class=org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker  Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$2e0e67bf] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-03-26 20:10:33,267 INFO class=org.springframework.boot.web.embedded.tomcat.TomcatWebServer  Tomcat initialized with port(s): 8080 (http)
2020-03-26 20:10:34,434 INFO class=org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext  Root WebApplicationContext: initialization completed in 22895 ms
2020-03-26 20:10:39,649 INFO class=org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar  Registered '/actuator/jolokia' to jolokia-actuator-endpoint
2020-03-26 20:10:42,925 INFO class=org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver  Exposing 17 endpoint(s) beneath base path '/actuator'
2020-03-26 20:10:43,850 INFO class=org.springframework.security.web.DefaultSecurityFilterChain  Creating filter chain: any request, [es.indra.som.common.utilities.CorsFilter@26f5e45d, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@704c3bdf, org.springframework.security.web.context.SecurityContextPersistenceFilter@1e6d30c0, org.springframework.security.web.header.HeaderWriterFilter@5529522f, org.springframework.security.web.authentication.logout.LogoutFilter@4d2f9e3c, es.indra.som.security.filter.JWTAuthenticationFilter@37986daf, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@69d667a5, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@7ab1ad9, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@c82d925, org.springframework.security.web.session.SessionManagementFilter@1b60d324, org.springframework.security.web.access.ExceptionTranslationFilter@43a59289, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@61993d18]
2020-03-26 20:10:45,610 INFO class=org.springframework.scheduling.concurrent.ExecutorConfigurationSupport  Initializing ExecutorService 'applicationTaskExecutor'
2020-03-26 20:10:48,503 INFO class=org.springframework.scheduling.concurrent.ExecutorConfigurationSupport  Initializing ExecutorService
2020-03-26 20:10:51,398 INFO class=org.springframework.boot.web.embedded.tomcat.TomcatWebServer  Tomcat started on port(s): 8080 (http) with context path ''
2020-03-26 20:10:51,407 INFO class=org.springframework.boot.StartupInfoLogger  Started Application in 53.341 seconds (JVM running for 56.018)

ЖУРНАЛ ОШИБКИ, ПОТОМУ ЧТО ПРИЛОЖЕН ДОПОЛНИТЕЛЬНЫЙ ФИЛЬТР, КОТОРЫЙ НЕ ДОЛЖЕН

2020-03-26 20:11:16,144 ERROR class=com.microsoft.azure.spring.autoconfigure.aad.AADAppRoleStatelessAuthenticationFilter  Failed to initialize UserPrincipal.
com.nimbusds.jose.proc.BadJOSEException: Signed JWT rejected: Another algorithm expected, or no matching key(s) found
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:384)
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:330)
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:321)
    at com.microsoft.azure.spring.autoconfigure.aad.UserPrincipalManager.buildUserPrincipal(UserPrincipalManager.java:83)
    at com.microsoft.azure.spring.autoconfigure.aad.AADAppRoleStatelessAuthenticationFilter.doFilterInternal(AADAppRoleStatelessAuthenticationFilter.java:58)
    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.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)
    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

Дело в том, что что раньше только с DDBBSecurized и NoSecurity не работает идеально. Почему для ADDfilter, даже если я отключаю его по профилю, применяется фильтр?

Я также пытался

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class , SecurityFilterAutoConfiguration.class,
    AADAuthenticationFilterAutoConfiguration.class})

Я также пытался удалить полную конфигурацию AzureSecurityConfiguration .... но это не сработало Событие, если я удаляю полный класс, оно проходит фильтр

Но это не сработало, и приложение не запускается, потому что ему требуется AADAuthenticationFilterAutoConfiguration для автоматической настройки фильтров, предоставляемых библиотекой, со свойствами, установленными в applicationacion.yaml. пользователь вручную настраивает их.

Заранее спасибо.

...