Skip to content

feat(security): enable CSRF for state-changing requests (#1056)#1077

Open
Levasey wants to merge 1 commit intohexlet-volunteers:mainfrom
Levasey:iss1056
Open

feat(security): enable CSRF for state-changing requests (#1056)#1077
Levasey wants to merge 1 commit intohexlet-volunteers:mainfrom
Levasey:iss1056

Conversation

@Levasey
Copy link
Copy Markdown

@Levasey Levasey commented Apr 7, 2026

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.

…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())
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Предлагаю подумать над способом, как можно избежать необходимости писать .with(csrf()) в каждом запросе. И .header("X-Inertia", "true") тоже. Предложи варианты в чате, обсудим.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вариант 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 без этого дефолта, либо явно переопределять/снимать дефолт на отдельных запросах — иначе «глобальная приправа» мешает.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants