Depois de configurar o Spring Security 3.2, _csrf.token
não está vinculado a uma solicitação ou a um objeto de sessão.
Esta é a configuração de segurança da primavera:
<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>
O arquivo 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>
E ele renderiza o próximo html:
<input type="hidden" name="" value="" />
O resultado é o status HTTP 403:
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
UPDATE Depois de alguma depuração, o objeto de solicitação sai de forma fina DelegatingFilterProxy, mas na linha 469 de CoyoteAdapter ele executa request.recycle (); que apaga todos os atributos ...
Testo no Tomcat 6.0.36, 7.0.50 com JDK 1.7.
Eu não entendi esse comportamento, ao invés de, seria possível se alguém me apontasse na direção de alguma guerra de amostra de aplicativo com Spring Security 3.2 que funciona com CSRF.
spring
spring-security
csrf
csrf-protection
Hugo Robayo
fonte
fonte
spring-security.xml
) com Spring 4.0.0 RELEASE (GA), Spring Security 3.2.0 RELEASE (GA) (embora seja integrado com Struts 2.3.16. Eu não dei um experimente apenas com Spring MVC). No entanto, ele falha, quando a solicitação é multiparte para upload de arquivos com o status 403. Estou lutando para encontrar uma solução para isso.web.xml
é crucial.MultipartFilter
deve ser declarado antesspringSecurityFilterChain
. Espero que ajude. Obrigado.Respostas:
Parece que a proteção CSRF (Cross Site Request Forgery) em seu aplicativo Spring está habilitada. Na verdade, ele está habilitado por padrão.
De acordo com spring.io :
Então, para desativá-lo:
Se você deseja manter a proteção contra CSRF ativada, deverá incluir em seu formulário o
csrftoken
. Você pode fazer assim:Você pode até incluir o token CSRF na ação do formulário:
fonte
.csrf().ignoringAntMatchers("/h2-console/**")
Você não deveria adicionar ao formulário de login ?;
Conforme declarado aqui na documentação de segurança do Spring
fonte
Se você aplicar
security="none"
, nenhum token csrf será gerado. A página não passará pelo filtro de segurança. Use a função ANONYMOUS.Não entrei em detalhes, mas está funcionando para mim.
fonte
Tente mudar isto:
<csrf />
a isto:<csrf disabled="true"/>
. Deve desativar o csfr.fonte
Com o thymeleaf você pode adicionar:
fonte
Documentação do Spring para desativar csrf: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure
fonte
Eu costumava ter o mesmo problema.
Sua configuração usa security = "none", portanto não pode gerar _csrf:
você pode definir access = "IS_AUTHENTICATED_ANONYMOUSLY" para a página /login.jsp substituir configuração acima:
fonte
eu acho que csrf só funciona com formas de mola
mude para
form:form
tag e veja se funciona.fonte
Por favor, veja meu aplicativo de amostra de trabalho no Github e compare com sua configuração.
fonte
Nenhuma das soluções funcionou comigo. O único que funcionou para mim na forma de primavera é:
action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"
SUBSTITUÍDO POR:
action = "./ upload? _csrf = $ {_ csrf.token}"
(Spring 5 com csrf habilitado na configuração java)
fonte
Em seu controlador, adicione o seguinte:
E na página jsp adicione
fonte