2015-06-03 3 views
0

Я вытягиваю свои волосы. Окружающая среда - приложение JAXRS (используя Джерси) Restful, настроенное с помощью Spring Boot. Я разрабатываю уровень оркестровки, который взаимодействует с микросервисами. Уровень оркестровки использует RestTemplate для выполнения вызовов микросервисам.Отключить перенаправление весной Безопасность в Джерси Весенняя загрузка Приложение

По какой-то причине, когда код состояния уровня ошибки возвращается из службы оркестровки, Spring Security пытается отправить сообщение http://localhost:65448/error. У меня нет идеи, кто это делает. Я включил регистрацию, проследил код, просмотрел интернет и прочитал всю документацию ... Я не могу определить, какой класс пытается это сделать. Я не могу это остановить.

Вот моя весна конфигурации (заводной) для битов безопасности:

@Configuration 
@EnableWebSecurity 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
class SpringSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Inject 
    private UserService userService 

    @Inject 
    private StatelessAuthenticationFilter statelessAuthenticationFilter 

    void configure(WebSecurity web) throws Exception { 

    } 

    void configure(HttpSecurity http) throws Exception { 
     http 
       .anonymous().and() 
       // .servletApi().and() 
       .headers().cacheControl().and() 
       .exceptionHandling().disable() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
       .rememberMe().disable() 
       .csrf().disable() 
       .formLogin().disable() 
       .httpBasic().disable() 
       .jee().disable() 
       .logout().disable() 
       //.openidLogin().disable() 
       .authorizeRequests() 
       .filterSecurityInterceptorOncePerRequest(true) 

     // Allow anonymous logins 
       .antMatchers('/security/authc').permitAll() 

     // All other request need to be authenticated 
       .anyRequest().authenticated().and() 

     // Custom Token based authentication based on the header previously given to the client 
       .addFilterAfter(statelessAuthenticationFilter, BasicAuthenticationFilter) 
    } 

    void configure(AuthenticationManagerBuilder auth) { 
     auth 
       .userDetailsService(userService) 
       .passwordEncoder(passwordEncoder()) 
    } 

    @Bean 
    PasswordEncoder passwordEncoder() { 
     new BCryptPasswordEncoder() 
    } 

    @Bean 
    AuthenticationManager authenticationManagerBean() { 
     super.authenticationManagerBean() 
    } 

} 

Тест-код выполняет простую аутентификацию отдыха на основе путем размещения заголовка Authorization в authc конечной точке. Это работает как ожидалось, если служба оркестровки не возвращает код состояния уровня ошибки.

Вот соответствующая регистрация:

[2015-06-03 07:07:15.621] boot - 47784 INFO [qtp1012776440-21] --- LoggingFilter: 1 * Server has received a request on thread qtp1012776440-21 
1 > POST http://localhost:65448/security/authc 
1 > Accept: */* 
1 > Accept-Encoding: gzip,deflate 
1 > Authorization: bm90ZXhpc3RzOnRlc3RwYXNz 
1 > Connection: keep-alive 
1 > Content-Length: 0 
1 > Content-Type: application/x-www-form-urlencoded; charset=ISO-8859-1 
1 > Host: localhost:65448 
1 > User-Agent: Apache-HttpClient/4.2.1 (java 1.5) 

[2015-06-03 07:07:15.753] boot - 47784 INFO [qtp1012776440-21] --- LoggingFilter: 1 * Server responded with a response on thread qtp1012776440-21 
1 < 400 

[2015-06-03 07:07:15.757] boot - 47784 INFO [qtp1012776440-21] --- LoggingFilter: 2 * Server has received a request on thread qtp1012776440-21 
2 > POST http://localhost:65448/error 
2 > Accept: */* 
2 > Accept-Encoding: gzip,deflate 
2 > Authorization: bm90ZXhpc3RzOnRlc3RwYXNz 
2 > Connection: keep-alive 
2 > Content-Length: 0 
2 > Content-Type: application/x-www-form-urlencoded; charset=ISO-8859-1 
2 > Host: localhost:65448 
2 > User-Agent: Apache-HttpClient/4.2.1 (java 1.5) 

[2015-06-03 07:07:15.781] boot - 47784 INFO [qtp1012776440-21] --- LoggingFilter: 2 * Server responded with a response on thread qtp1012776440-21 
2 < 404 
2 < Content-Type: application/json 

HTTP/1.1 404 Not Found 
Date: Wed, 03 Jun 2015 11:07:15 GMT 
Pragma: no-cache 
X-Application-Context: Test:test:0 
Content-Type: application/json 
Transfer-Encoding: chunked 
Server: Jetty(9.2.9.v20150224) 

Пожалуйста, помогите, прежде чем я бросить компьютер в окно.

Приветствия

+0

Это, как представляется, имеет какое-то отношение к RestTemplate, который используется для общения с микросервисом. Это совершенно неожиданно. Я добавил регистрацию непосредственно после вызова restTemplate.getForEntity, и он никогда ничего не выводит. Почему клиент, ориентированный на отдых, выполняет перенаправление на статусы 40X/50X? Это не особенно успокаивает. – Todd

+0

Ничего. Это предыдущее утверждение неверно. – Todd

ответ

0

Hy,

Это поведение по умолчанию Причал, когда сервер отвечает кодом состояния> = 400 (для 404, за исключением), и ответ не имеет сущности. Вы можете «отключить» это поведение с помощью параметров перечисляете пустые страницы ошибок

@Bean 
public EmbeddedServletContainerCustomizer containerCustomizer() { 

    return new EmbeddedServletContainerCustomizer() { 
     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      // On skippe la redirection /error realise 
      container.setErrorPages(Sets.<ErrorPage> newConcurrentHashSet()); 
     } 
    }; 
} 

Несмотря на это временное решение, сервер будет посылать статус реального HTTP с телом XML (см ErrorHandler)

Это также футляр.

+0

Я переключился на tomcat, и это все еще происходит. – Todd

1

Это вызвано ErrorMvcAutoConfiguration. Вы можете отключить его (через exclude в аннотации EnableAutoConfiguration) или изменить свой путь, если у вас есть собственный путь ошибки, с свойством error.path.

+0

К сожалению, это не имеет никакого эффекта. Я исключил его через: @EnableAutoConfiguration (exclude = ErrorMvcAutoConfiguration), но не повезло. – Todd

+0

Это работало для меня. – cahen

Смежные вопросы