Добавить токен CSRF в RestTemplate Получить запрос на страницу, защищенную формой Войти - PullRequest
0 голосов
/ 22 февраля 2019

Следующий тест не пройден, так как он возвращает страницу входа, а не содержимое.

TestRestTemplate restTemplate = new TestRestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.TEXT_HTML));
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> form = new LinkedMultiValueMap<>();
form.set("username", testUser.getUser().getUid());
form.set("password", testUser.getUserPassword());

ResponseEntity<String> loginEntity = restTemplate.exchange(
  url("/login"),
  HttpMethod.POST, 
  new HttpEntity<>(form, headers), 
  String.class);

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(MediaType.TEXT_HTML));
requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// 
// auth csrf and form login - doesn't work
ResponseEntity<String> getLoginEntity = restTemplate.getForEntity(url("/login"), String.class);
String cookie = getLoginEntity.getHeaders().getFirst(HttpHeaders.SET_COOKIE);
// contains CSRF-TOKEN
requestHeaders.set(HttpHeaders.COOKIE, cookie);
Pattern pattern = Pattern.compile("(?s).*name=\"_csrf\".*?value=\"([^\"]+).*");
Matcher matcher = pattern.matcher(getLoginEntity.getBody());
matcher.matches();
requestHeaders.set("X-CSRF-TOKEN", matcher.group(1));
//

ResponseEntity<String> memberEntity = restTemplate.exchange(
  url("/members"),
  HttpMethod.GET,
  new HttpEntity<>(form, requestHeaders),
  String.class
);
assertEquals("Unexpected member content", "Welcome member!", memberEntity.getBody());

Конфигурация похожа на такую:

protected void configure(HttpSecurity http) throws Exception {
  http
    .csrf().and()
    .authorizeRequests()
      .antMatchers("/**").fullyAuthenticated()
      .and()
    .formLogin()
      .permitAll();
}

Возвращенная страница входа включает _csrf какскрытое поле и значение соответствует значению, которое было установлено в файле cookie.

Обратите внимание, что с незначительными изменениями я могу заставить работать следующие сценарии:

Тем не менее, у меня не было успеха с

  • формой входа в систему и csrf

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

Кстати: подход, который я выбрал, следующий: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web-secure/src/test/java/sample/web/secure/SampleSecureApplicationTests.java

...