После настройки Spring Security 3.2 _csrf.token
не привязан к запросу или объекту сеанса.
Это весенняя конфигурация безопасности:
<http pattern="/login.jsp" security="none"/>
<http>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/index.jsp"/>
<logout/>
<csrf />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_USER/>
</user-service>
</authentication-provider>
</authentication-manager>
Файл login.jsp
<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<button id="ingresarButton"
name="submit"
type="submit"
class="right"
style="margin-right: 10px;">Ingresar</button>
<span>
<label for="usuario">Usuario :</label>
<input type="text" name="j_username" id="u" class="" value=''/>
</span>
<span>
<label for="clave">Contraseña :</label>
<input type="password"
name="j_password"
id="p"
class=""
onfocus="vc_psfocus = 1;"
value="">
</span>
</form>
И он отображает следующий html:
<input type="hidden" name="" value="" />
Результат - статус HTTP 403:
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
ОБНОВЛЕНИЕ После некоторой отладки объект запроса отлично выводится из формы DelegatingFilterProxy, но в строке 469 CoyoteAdapter он выполняет request.recycle (); который стирает все атрибуты ...
Я тестирую в Tomcat 6.0.36, 7.0.50 с JDK 1.7.
Я не понял этого поведения, скорее всего, это было бы возможно, если бы кто-то указал мне на какую-то войну примеров приложений с Spring Security 3.2, которая работает с CSRF.
spring
spring-security
csrf
csrf-protection
Хьюго Робайо
источник
источник
spring-security.xml
) с Spring 4.0.0 RELEASE (GA), Spring Security 3.2.0 RELEASE (GA) (хотя он интегрирован со Struts 2.3.16. Я не давал ему попробуйте только Spring MVC). Однако это не удается, когда запрос является составным для загрузки файлов со статусом 403. Я изо всех сил пытаюсь найти решение для этого.web.xml
имеет решающее значение.MultipartFilter
должен быть объявлен раньшеspringSecurityFilterChain
. Надеюсь, это поможет. Спасибо.Ответы:
Похоже, что в вашем приложении Spring включена защита CSRF (подделка межсайтовых запросов). Собственно по умолчанию он включен.
По данным spring.io :
Итак, чтобы отключить его:
@Configuration public class RestSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } }
Если вы хотите, чтобы защита CSRF была включена, вы должны включить в свою форму файл
csrftoken
. Сделать это можно так:<form .... > ....other fields here.... <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> </form>
Вы даже можете включить токен CSRF в действие формы:
<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">
источник
.csrf().ignoringAntMatchers("/h2-console/**")
Разве вы не должны добавить в форму входа ?;
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
Как указано здесь, в документации по безопасности Spring
источник
Если вы
security="none"
подадите заявку, токен csrf не будет создан. Страница не будет проходить через фильтр безопасности. Используйте роль АНОНИМНЫЙ.Я не вдавался в подробности, но у меня это работает.
<http auto-config="true" use-expressions="true"> <intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" /> <!-- you configuration --> </http>
источник
Попробуйте изменить:
<csrf />
к этому:<csrf disabled="true"/>
. Он должен отключить csfr.источник
К чабрецу вы можете добавить:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
источник
Документация Spring для отключения csrf: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } }
источник
У меня была такая же проблема.
В вашей конфигурации используется security = "none", поэтому невозможно создать _csrf:
<http pattern="/login.jsp" security="none"/>
вы можете установить access = "IS_AUTHENTICATED_ANONYMOUSLY" для страницы /login.jsp, заменив вышеуказанную конфигурацию :
<http> <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <intercept-url pattern="/**" access="ROLE_USER"/> <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=1" default-target-url="/index.jsp"/> <logout/> <csrf /> </http>
источник
я думаю, что csrf работает только с пружинными формами
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
измените на
form:form
тег и посмотрите, что работает.источник
Пожалуйста, посмотрите мой рабочий образец приложения на Github и сравните его с вашей настройкой.
источник
Ни одно из решений у меня не сработало. Единственное, что сработало для меня в форме Spring, это:
action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"
ЗАМЕНЕН НА:
action = "./ upload? _csrf = $ {_ csrf.token}"
(Spring 5 с включенным csrf в конфигурации java)
источник
В вашем контроллере добавьте следующее:
@RequestParam(value = "_csrf", required = false) String csrf
И на странице jsp добавьте
<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
источник