Spring Boot REST API — включить/отключить защиту CSRF по типу клиента (браузер/не браузер)?

У меня есть REST API Spring Boot. Из-за политики безопасности мне нужно включить защиту CSRF для конечных точек, к которым обращается браузер. Тем не менее, этот API также будет доступен пользователям, не использующим браузеры. Есть ли способ создать два набора конечных точек, один из которых доступен для браузеров только с включенным CSRF, а другой доступен для не-браузеров только с отключенным CSRF?

Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Community 18.03.2022 16:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, у вас могут быть отдельные базы URL для запросов браузера и запросов API.

Например, у вас могут быть все конечные точки, которые должны запрашиваться не-браузерами, в /api/..., а в вашем классе SpringBootSecurityConfiguration и методе configure(HttpSecurity http) вы можете условно отключить CSRF с помощью http.csrf().disable();, если шаблон соответствует (отличный учебник можно найти здесь)

Обновлено: вот еще один отвечать, который может быть полезен.

Спасибо за отзыв. Однако не будет ли этот набор конечных точек, не являющихся браузерами, по-прежнему доступным для браузеров? Есть ли способ ограничить данную конечную точку одним типом клиента или другим?

R. Overbeck 18.03.2022 17:18

Вы можете настроить роли и полномочия, а также сделать так, чтобы пользователи API имели другой уровень безопасности, чем пользователи, которые зарегистрировались через браузер. Может быть, это возможный подход для вас? В конце концов, браузер просто делает запросы от имени пользователя, так что теоретически, насколько я знаю, на самом деле нет разницы по типу, но вы можете усилить это разделение вручную. Является ли ваша главная забота безопасностью и обеспечением того, чтобы браузер (конечные пользователи) не наткнулся на небезопасную конечную точку?

ferrouskid 18.03.2022 22:00
Ответ принят как подходящий

Когда вы настраиваете защиту CSRF с помощью DSL, например, http.csrf()..., вы можете указать, к каким запросам вы хотите применить защиту CSRF, передав RequestMatcher, например:

http.csrf(csrf -> csrf.requireCsrfProtectionMatcher(new MyBrowserRequestMatcher()));

И ваша реализация RequestMatcher может проверить, содержит ли HttpServletRequest заголовок X-Requested-With: XMLHttpRequest или проверить User-Agent.

Просто имейте в виду, что заголовки могут быть изменены, и у вас нет гарантии, что запрос действительно исходит из браузера или небраузерного приложения.

Другие вопросы по теме