У меня есть REST API Spring Boot. Из-за политики безопасности мне нужно включить защиту CSRF для конечных точек, к которым обращается браузер. Тем не менее, этот API также будет доступен пользователям, не использующим браузеры. Есть ли способ создать два набора конечных точек, один из которых доступен для браузеров только с включенным CSRF, а другой доступен для не-браузеров только с отключенным CSRF?
Я думаю, у вас могут быть отдельные базы URL для запросов браузера и запросов API.
Например, у вас могут быть все конечные точки, которые должны запрашиваться не-браузерами, в /api/...
, а в вашем классе SpringBootSecurityConfiguration
и методе configure(HttpSecurity http)
вы можете условно отключить CSRF с помощью http.csrf().disable();
, если шаблон соответствует (отличный учебник можно найти здесь)
Обновлено: вот еще один отвечать, который может быть полезен.
Спасибо за отзыв. Однако не будет ли этот набор конечных точек, не являющихся браузерами, по-прежнему доступным для браузеров? Есть ли способ ограничить данную конечную точку одним типом клиента или другим?
Вы можете настроить роли и полномочия, а также сделать так, чтобы пользователи API имели другой уровень безопасности, чем пользователи, которые зарегистрировались через браузер. Может быть, это возможный подход для вас? В конце концов, браузер просто делает запросы от имени пользователя, так что теоретически, насколько я знаю, на самом деле нет разницы по типу, но вы можете усилить это разделение вручную. Является ли ваша главная забота безопасностью и обеспечением того, чтобы браузер (конечные пользователи) не наткнулся на небезопасную конечную точку?
Когда вы настраиваете защиту CSRF с помощью DSL, например, http.csrf()...
, вы можете указать, к каким запросам вы хотите применить защиту CSRF, передав RequestMatcher
, например:
http.csrf(csrf -> csrf.requireCsrfProtectionMatcher(new MyBrowserRequestMatcher()));
И ваша реализация RequestMatcher
может проверить, содержит ли HttpServletRequest
заголовок X-Requested-With: XMLHttpRequest
или проверить User-Agent
.
Просто имейте в виду, что заголовки могут быть изменены, и у вас нет гарантии, что запрос действительно исходит из браузера или небраузерного приложения.
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.