#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?