Следующий тест не пройден, так как он возвращает страницу входа, а не содержимое.
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