Почему TestRestTemplate допускает повторное запрос без проверки подлинности в ИТ-тестах SpringBoot? - PullRequest
0 голосов
/ 20 июня 2019

В моем приложении springBoot (RELEASE 1.5.20) включена обычная аутентификация.Я создал полный ИТ-тест со следующим кодом

@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = "securedIT")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MYtestIT{
@LocalServerPort
     private int port;

   private String getRootUrl() {
        return "http://localhost:" + port;
   }

   @Autowired
   private TestRestTemplate restTemplate;

    @Test
    public void testAdmincachWitheWrongAuthentication() {
        String baseUri = getRootUrl() + CONTEXT_ROOT;
         HttpEntity<String> entity = new HttpEntity<>(null,  new HttpHeaders());
         URI url = URI.create(baseUri + "/ref/cache/task");

       ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, entity, String.class);
       //ResponseEntity<String> response = restTemplate.withBasicAuth("user", "myPwd").exchange(url, HttpMethod.DELETE, entity, String.class);

     assertEquals(ReferenceWSIT.MSG_WRON_STATUS,401, response.getStatusCode().value());
    }
}

И в приложении конфигурация выглядит следующим образом:

@Configuration
public class GlobalWebSecurityConfigurerAdapter extends 
WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("ref/v1/**").permitAll()
            .antMatchers("ref/cache/**").authenticated().and().httpBasic();
    }   
}

Когда я запускаю приложение, фильтр аутентификации работает отлично, проблемапроисходит, когда я запускаю интеграционный тест Junit.Если я вызываю restTemplate.withBasicAuth (), тест завершается неудачно или успешно, в зависимости от положительных или плохих учетных данных.Но если в случае прямого вызова restTemplate без BasicAuth все запросы будут разрешены (поэтому мое тестовое утверждение не выполнено).

Как ИТ-тест с моей полной конфигурацией, я бы ожидал, что аутентификация была обязательной, почему это не так

1 Ответ

0 голосов
/ 10 июля 2019

[EDIT] мое первое решение было неверным, правильная конфигурация:

@Configuration
public class GlobalWebSecurityConfigurerAdapter extends 
WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                .anonymous().disable()
                //following will disable cookie session to force the browser to Authenticate on each request      
               .sessionManagement()
               .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
               .and()
               .authorizeRequests()
               .antMatchers("/ref/cache/**")
               .authenticated().and().httpBasic()
               .and()
               .addFilterAfter(new HmacSecurityFilter(), BasicAuthenticationFilter.class)
               ;
    }   
}

Первая ошибка: antMatcher должен начинаться с "/": "/ref/cache/**" вместо "ref/cache/**"

Во-вторых, во втором фильтре (HmacSecurityFilter) я проверяю любой запрос (ранее .antMatchers("ref/v1/**").permitAll()) и делаю собственный код, чтобы избежать проверки аутентифицированного URI (/ ref / cache / **).

...