Spring Security CSRF Disable не работает

У меня есть приложение, которое использует Spring Security для аутентификации. Раньше мы использовали Spring Security 3.2.10, а теперь пытаемся перейти на 4.2.6. Начиная с весны 4 по умолчанию включена защита CSRF.

Я следую руководству по миграции - https://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-xml.html

Когда я просто изменил пространство имен и заменил jar-файлы безопасности и попытался войти со страницы входа, он выдал ошибку 404 для «/ j_spring_security_check».

Согласно Руководству, я изменил действие входа в форму на «/ login» вместо «/ j_spring_security_check». Также изменились параметры имени пользователя и пароля на «имя пользователя» и «пароль» вместо «j_username» и «j_password», определенных на странице входа.

 <form action = "/login" method = "POST">

После этих изменений я получаю ошибку, связанную с токеном CSRF, с кодом состояния 403 -

 Type Status Report
 Message Could not verify the provided CSRF token because your session was 
 not found.
 Description The server understood the request but refuses to authorize it.

Я отключил защиту CSRF, добавив ниже в файл конфигурации безопасности Spring -

  <security:http disable-url-rewriting = "true" use-expressions = "true">
    <security:csrf disabled = "true"/>
    ..
    <security:intercept-url pattern = "/login.jsp" 
    access = "hasRole('ROLE_ANONYMOUS')"/>
    <security:form-login login-page = "/login.jsp"
                         authentication-failure-url = "/login.jsp? 
                         login_error=1"
                         default-target-url = "/index.html" authentication- 
             success-handler-ref = "successHandler" always-use-default- 
    target = "true"/>
    <security:logout logout-success-url = "/login.jsp"/>

Но все же это не работает и дает мне ошибку, связанную с CSRF, со статусом 403 -

 Type Status Report
 Message Could not verify the provided CSRF token because your session was 
 not found.
 Description The server understood the request but refuses to authorize it.

Что мне не хватает?

попробуйте опустить часть security:. Сделайте только это: <csrf disabled = "true"/>. Если это не сработает, покажите мне свои пространства имен, пожалуйста

ISlimani 04.07.2018 08:23

Это не сработало. Мое пространство имен выглядит так: <beans xmlns = "springframework.org/schema/beans" xmlns: xsi = "w3.org/2001/XMLSchema-instance" xmlns: security = "springframework.org/schema/security" xsi: schemaLocation = "springframework.org/schema/beansspringframework.org/schema/beans/spring-beans-4.2.xsdspringframework.org/schema/securityspringframework.org/schema/security/spring-security-4.2.xsd" ‌>

Rahul Vedpathak 04.07.2018 09:07

Я попытался запустить API, которые не будут изменять состояние ресурсов, например GET. Они работают нормально. Но при входе в приложение запускается POST api. Эти API не работают.

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

Ответы 1

Я наконец нашел проблему. Фактически в нашем приложении A у нас есть список URI, которые могут обрабатываться этим приложением B, иначе оно пересылает запрос другому приложению.

Итак, раньше в этом списке был j_spring_security_check. Но я пропустил добавление "/ login" в этот список.

В этом приложении B CSRF не был отключен, следовательно, это вызывало проблему.

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