У меня есть приложение, которое использует 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.
Что мне не хватает?
Это не сработало. Мое пространство имен выглядит так: <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" >
Я попытался запустить API, которые не будут изменять состояние ресурсов, например GET. Они работают нормально. Но при входе в приложение запускается POST api. Эти API не работают.




Я наконец нашел проблему. Фактически в нашем приложении A у нас есть список URI, которые могут обрабатываться этим приложением B, иначе оно пересылает запрос другому приложению.
Итак, раньше в этом списке был j_spring_security_check. Но я пропустил добавление "/ login" в этот список.
В этом приложении B CSRF не был отключен, следовательно, это вызывало проблему.
попробуйте опустить часть
security:. Сделайте только это:<csrf disabled = "true"/>. Если это не сработает, покажите мне свои пространства имен, пожалуйста