Как добавить токен CSRF в HTML

#html #spring-security #spring-boot #csrf

#HTML #spring-безопасность #spring-boot #csrf

Вопрос:

Я разрабатываю приложение Springboot, в котором есть формы регистрации и входа в систему, работающие с spring security. Я использую HTML5 для просмотров, но я не знаю, как я могу добавить токен CSRF. На данный момент я получаю страницу с ошибкой whitelabel:

Страница с ошибкой Белой метки

Это приложение не имеет явного отображения для /error, поэтому вы рассматриваете это как запасной вариант.

Сб, 22 октября, 09:07:06 по восточному времени 2016 Произошла неожиданная ошибка (тип =Запрещено, статус = 403). Недопустимый токен CSRF ‘null’ был найден в параметре запроса ‘_csrf’ или заголовке ‘X-CSRF-TOKEN’.

Это моя регистрационная HTML-форма:

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:th="http://www.thymeleaf.org">

<head lang="en">
    <meta charset="UTF-8"/>
    <title>Registration</title>
    <!-- Bootstrap core CSS -->
    <link href="css/bootstrap.min.css" rel="stylesheet" />
    <link href="css/common.css" rel="stylesheet" />

</head>
<body>

<div class="container">
    <form method="POST" modelAttribute="userForm" class="form-signin">
        <h2 class="form-signin-heading">Create your account</h2>
        <bind path="username">
            <div class="form-group ${status.error ? 'has-error' : ''}">
                <input type="text" path="username" class="form-control" placeholder="Username"
                            autofocus="true"/>
                <errors path="username"></errors>
            </div>
        </bind>

        <bind path="password">
            <div class="form-group ${status.error ? 'has-error' : ''}">
                <input type="password" path="password" class="form-control" placeholder="Password"/>
                <errors path="password"></errors>
            </div>
        </bind>

        <bind path="passwordConfirm">
            <div class="form-group ${status.error ? 'has-error' : ''}">
                <input type="password" path="passwordConfirm" class="form-control"
                            placeholder="Confirm your password"/>
                <errors path="passwordConfirm"></errors>
            </div>
        </bind>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button>
    </form>

</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</body>
</html>  

Я не хочу отключать CSRF из spring Security, поскольку это защитит приложение.

Большое вам спасибо

Андрес

Редактировать:

Я пробовал это, но не сработало:

         <input type="hidden" id= "csrf-token" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button>  

ошибка:

 2016-10-22 11:55:56.452 ERROR 18960 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
at com.golosinaspitufos.security.validator.UserValidator.validate(UserValidator.java:25) ~[classes/:na]
at com.golosinaspitufos.security.web.UserController.registration(UserController.java:35) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101]
  

Класс пользовательского контроллера:

 @Controller
public class UserController {
@Autowired
private UserService userService;

@Autowired
private SecurityService securityService;

@Autowired
private UserValidator userValidator;

@RequestMapping(value = "/registration", method = RequestMethod.GET)
public String registration(Model model) {
    model.addAttribute("userForm", new User());

    return "registration";
}

@RequestMapping(value = "/registration", method = RequestMethod.POST)
public String registration(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) {
    userValidator.validate(userForm, bindingResult);

    if (bindingResult.hasErrors()) {
        return "registration";
    }
    userService.save(userForm);
    securityService.autologin(userForm.getUsername(), userForm.getPasswordConfirm());
    return "redirect:/welcome";
}

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(Model model, String error, String logout) {
    if (error != null)
        model.addAttribute("error", "Your username and password is invalid.");

    if (logout != null)
        model.addAttribute("message", "You have been logged out successfully.");

    return "login";
}

@RequestMapping(value = {"/", "/welcome"}, method = RequestMethod.GET)
public String welcome(Model model) {
    return "welcome";
}
}
  

Комментарии:

1. Спасибо @dur за ответ. Я спрашиваю, как добавить токен CSRF. Я пробовал «<тип ввода =»скрытый» идентификатор = «csrf-token» th: name=»${_csrf.ParameterName}» th: value=»${_csrf.token}»/>» (см. Мою правку), но это не сработало

2. Привет @dur. Да, это был бы вопрос. Я не знал, что

3. Привет @dur, для jsp, используя из из «<%@ taglib prefix=»form» uri=» springframework.org/tags/form » %>» решите проблему. Каким было бы эквивалентное решение для html?