feat(security): enable CSRF for state-changing requests (#1056)#1077
feat(security): enable CSRF for state-changing requests (#1056)#1077Levasey wants to merge 1 commit intohexlet-volunteers:mainfrom
Conversation
…teers#1056) Replace global csrf.disable() with CookieCsrfTokenRepository and XorCsrfTokenRequestAttributeHandler. Expose X-XSRF-TOKEN in CORS. Configure Inertia/axios xsrf defaults and include credentials on initial fetch. Add csrf() to MockMvc mutation tests and a negative API test without token. Declare axios as a direct frontend dependency. Made-with: Cursor
| """; | ||
|
|
||
| mockMvc.perform(post("/admin/marketing/articles") | ||
| .with(csrf()) |
There was a problem hiding this comment.
Предлагаю подумать над способом, как можно избежать необходимости писать .with(csrf()) в каждом запросе. И .header("X-Inertia", "true") тоже. Предложи варианты в чате, обсудим.
There was a problem hiding this comment.
Вариант 1: один RequestPostProcessor — inertiaWithCsrf()
Идея: один раз описать, что значит «запрос как от Inertia с CSRF»: внутри — то же, что сейчас делают .with(csrf()) и .header("X-Inertia", "true"), наружу — одно имя.
Плюс: дублируется не логика, а только факт «этому запросу нужен этот режим» — строка короче, ошибиться сложнее (не забудешь один из двух шагов).
Минус: на каждом таком запросе всё равно нужно написать .with(inertiaWithCsrf()) — повтор указания остаётся, просто он компактнее.
Вариант 2: defaultRequest на уровне MockMvc
Идея: при сборке MockMvc один раз задать «общую приправу» для всех запросов этого экземпляра (через MockMvcConfigurer, MockMvcBuilders..., @TestConfiguration — способ вторичен, суть одна).
Плюс: в типичных тестах не перечисляешь ни CSRF, ни Inertia на каждой строке — они уже «вшиты» в этот MockMvc.
Минус: всё, что выполняется через этот MockMvc, по умолчанию получит и CSRF-настройку, и заголовок. Тесты, где важен запрос без X-Inertia (или без лишнего на GET), нужно либо вынести в другой класс/конфиг с другим MockMvc без этого дефолта, либо явно переопределять/снимать дефолт на отдельных запросах — иначе «глобальная приправа» мешает.
Replace global csrf.disable() with CookieCsrfTokenRepository and XorCsrfTokenRequestAttributeHandler. Expose X-XSRF-TOKEN in CORS. Configure Inertia/axios xsrf defaults and include credentials on initial fetch. Add csrf() to MockMvc mutation tests and a negative API test without token. Declare axios as a direct frontend dependency.