Передача JSessionId и CSRF-токена в Spring Boot для POST - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть приложение Spring Boot 2.1.0.RELEASE.Я пытаюсь понять конфигурацию входа в систему и конфигурацию CSRF, поэтому я сначала отправляю запрос GET:

 GET http://localhost:8080/devices
 Accept: application/json
 Authorization: Basic user test

Повторное выполнение с полученным JSessionID также работает:

GET http://localhost:8080/devices
Accept: application/json
#Authorization: Basic user test
cookie: JSESSIONID=162A7A29081CC89EA444423D9508F286

Пока все хорошо.Я получил 200 ответов и получил токен CSRF.Последнее:

HTTP/1.1 200 
Set-Cookie: XSRF-TOKEN=2adcabdd-d804-4f13-a2a6-b95621ce868c; Path=/
....

Хорошо, теперь я хочу попробовать POST-запрос напрямую:

POST localhost:8080/devices/check
Content-Type: application/json
#Authorization: Basic user password
cookie: JSESSIONID=162A7A29081CC89EA444423D9508F286; XSRF-TOKEN=2adcabdd-d804-4f13-a2a6-b95621ce868c
#X-XSRF-TOKEN: 2adcabdd-d804-4f13-a2a6-b95621ce868c

Но независимо, если я попытаюсь передать маркер XSRF через Cookie или Header,Я получу 403 Запрещено.

Это моя конфигурация Spring Security:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository
                        .withHttpOnlyFalse()).and()
                .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
                .httpBasic().and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

}

Что я здесь не так делаю?

Fyi: Я отправляю запросы сHTTP-клиент IntelliJ.

1 Ответ

0 голосов
/ 18 августа 2019

Вот что я сделал:

Получите ваше печенье из вашего RequestContext:

function getMyToken() {
    Cookies[] cookies = getRequestContext().getRequest().getCookies()
    for (cookie in cookies) {
        if (cookie.getName().equals("XSRF-TOKEN")) return cookie.getValue()
    }
}

Тогда в моей форме:

<input name="_csrf" value="getMyToken()"/>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...