Обновление и рефакторинг. XSS. Удаление Spring Data Rest

7.1 Обновление и рефакторинг

  • pom.xml - обновил версии. Для тестов выставил UTF-8 кодировку и для запуска их из IDEA добавил зависимость junit-platform-launcher
  • AppConfig - в тестах не поднимаем H2 TCP Server
  • OpenApiConfig - добавил креденшелы тестирования
  • AccountController, WebSecurityConfig, AccountControllerTest - регистрацию нового пользователя вместо GET /register делаю через POST
  • WebSecurityConfig - решил проблему с циклической зависимостью (ОБНОВЛЕНО), ObjectMapper добавляю через @Autowired
  • AppException - поправил вывод сообщений об ошибке
  • BaseEntity - в Swagger убрал id из примера тела объекта при создании/обновлении, см. asymmetric solution. При этом остается возможность его передавать в теле и мы его по прежнему проверяем в ValidationUtil
  • User, UserTo - переопределил toString покороче
  • переместил AuthUser, ValidationUtil, GlobalExceptionHandler
  • переименовал приложение и БД в bootjava
  • GlobalExceptionHandler - сделал красивые сообщения на большинство типичных ошибок
mvn clean test

7.2 Защита от XSS (Cross Site Scripting)

Сейчас мы никак не проверяем содержимое текстовых полей при создании/модификации объектов. Это грозит безопасности приложения, которое будет использовать данные, например, для вывода в браузере пользователя: Раньше я реализовывал XSS защиту через @SafeHtml, пока его не удалили из hibernate validator. Пришлось сделать собственную аннотацию @NoHtml на основе Sanitizing User Input и jsoup - Sanitize HTML.
При этом поля password проверять не надо, т.к. он не выводится в html, а email надо.
Apply patch 7_02_xss_validation

7.3 Удаление Spring Data Rest (опционально)

Можно делать приложение с использованием Spring Data Rest/HATEOAS: контроллеры генерируются автоматически по репозиториям, требуется настройка ресурсов в кастомных контроллерах. Или можно использовать чистый REST, многие вещи при этом упрощаются. Сделаем миграцию на простой REST и уберем Spring Data Rest из проекта.

Большинство кода добавилось из проекта стажировки TopJava:

  • pom.xml - удалил все, что относится к spring-data-rest.
    Добавил jackson-datatype-hibernate5 для обнуления LAZY полей при сериализации в JSON
  • AccountController переименовал в ProfileController, добавился AdminUserController, AbstractUserController
  • Добавил проверку на дублирующий email как Spring валидацию: UniqueMailValidator, HasIdAndEmail
  • Добавил утильные классы JsonUtil, UserUtil, SecurityUtil
  • Добавил пакет user, класс NamedEntity и TO классы BaseTo, NamedTo, UserTo как основу для большого проекта
  • Общие вещи для всех репозиториев вынес в базовый BaseRepository
  • Добавил тесты на все методы контроллеров и валидацию. Общий код для тестирования контроллеров вынес в MatcherFactory