Как обработать создание сеанса и добавить скрытый входной токен csrf для любой страницы, содержащей форму для анонимного пользователя в Spring Boot? - PullRequest
0 голосов
/ 06 мая 2018

Представляю проблему:

когда я запускаю приложение и ввожу URL "/ home". Домашняя страница отображается, но не правильно (шаблон плохо организован), и я получаю исключение TemplateInputException . Через некоторое время, если я обновляю домашнюю страницу и другие страницы, она возвращается в нормальное состояние, но если я захожу в «/ login» и я выхожу из системы, которая перенаправляет меня на домашний вид, та же проблема возвращается снова.

Консоль стека:

org.thymeleaf.exceptions.TemplateInputException: произошла ошибка при разборе шаблона (template: "ресурс пути к классу [templates / home.html] ") ...

Вызвано: org.attoparser.ParseException : ошибка во время выполнения процессора 'org.thymeleaf.spring4.processor.SpringActionTagProcessor' (шаблон: «дом» - строка 2494, столбец 10) в org.attoparser.MarkupParser.parseDocument (MarkupParser.java:393) ~ [Attoparser-2.0.4.RELEASE.jar: 2.0.4.RELEASE] ...

Причина: org.thymeleaf.exceptions.TemplateProcessingException : ошибка во время исполнения процессора 'org.thymeleaf.spring4.processor.SpringActionTagProcessor' (шаблон: «дом» - строка 2494, столбец 10)

Причина: java.lang.IllegalStateException: Невозможно создать сеанс после того, как ответ был зафиксирован в org.apache.catalina.connector.Request.doGetSession (Request.java:2995) ~ [-Встраивать кот-ядро-8.5.14.jar: 8.5.14]

...

at org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.saveToken (HttpSessionCsrfTokenRepository.java:63) ~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] в org.springframework.security.web.csrf.LazyCsrfTokenRepository $ SaveOnAccessCsrfToken.saveTokenIfNecessary (LazyCsrfTokenRepository.java:176) ~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] в org.springframework.security.web.csrf.LazyCsrfTokenRepository $ SaveOnAccessCsrfToken.getToken (LazyCsrfTokenRepository.java:128) ~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] в org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor. getExtraHiddenFields (CsrfRequestDataValueProcessor.java:71) ~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] ...

Код источника:

Проблема в контактной форме home.html в этой строке: th:action="@{/home/contact}" th:object="${mailForm}":

<form id="contact-form" method="post" action="/home/contact}" 
    th:action="@{/home/contact}" th:object="${mailForm}"
    role="form">
    <!-- <input type="hidden" name="${_csrf.parameterName}" 
    value="${_csrf.token}" /> -->
    <input type="text" name="senderName" th:field="*{senderName}"> 
    <input type="text" name="senderLastName" th:field="*{senderLastName}">  
    <input type="email" name="senderEmail" th:field="*{senderEmail}">            
    <textarea name="message" th:field="*{message}"></textarea>
    <button type="submit">Send Message</button>
</form>

Я думаю, что это проблема с токеном csrf. Я попытался добавить эту строку <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> в мою форму, и защита csrf включена по умолчанию в Spring Security, но она не сработала.

Контроллер, который вызывает службу для отправки почты:

@Controller
public class HomeController {
    @Autowired
    private EmailService emailService;
    @Autowired
    private MailValidator mailValidator;

    // some other code like @InitBinder methode ...

    // method to post mailForm
    @PostMapping("/home/contact")
    public String contactUsHome(@Valid @ModelAttribute("mailForm") final MailForm mailForm, BindingResult bindingResult)
            throws MessagingException {

        if (bindingResult.hasErrors()) {
            return HOME_VIEW;
        } else {
            mailForm.setRecipientEmail(recipientEmail);
            Mail mail = DTOUtil.map(mailForm, Mail.class);
            emailService.sendSimpleMail(mail);
            return REDIRECT_HOME_VIEW;
        }
    }
}

1 Ответ

0 голосов
/ 17 мая 2018

Вот как исправить проблему «Не удается создать сеанс и токен CSRF».

В классе настройки безопасности Spring я только что добавил эту строку .and().csrf().csrfTokenRepository(..), и все работает хорошо.

@Override
protected void configure(HttpSecurity http) throws Exception {
     http.authorizeRequests()
     //some another line of code...
     .and().csrf().csrfTokenRepository(new HttpSessionCsrfTokenRepository())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...