Après avoir configuré Spring Security 3.2, _csrf.token
n'est pas lié à une demande ou à un objet de session.
Voici la configuration de sécurité du printemps:
<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>
Le fichier 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>
Et il rend le prochain HTML:
<input type="hidden" name="" value="" />
Le résultat est un état HTTP 403:
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
UPDATE Après un certain débogage, l'objet de requête sort correctement DelegatingFilterProxy, mais dans la ligne 469 de CoyoteAdapter, il exécute request.recycle (); qui efface tous les attributs ...
Je teste dans Tomcat 6.0.36, 7.0.50 avec JDK 1.7.
Je n'ai pas compris ce comportement, plutôt que, ce serait possible si quelqu'un me dirigeait vers une guerre d'exemples d'application avec Spring Security 3.2 qui fonctionne avec CSRF.
spring
spring-security
csrf
csrf-protection
Hugo Robayo
la source
la source
spring-security.xml
) avec Spring 4.0.0 RELEASE (GA), Spring Security 3.2.0 RELEASE (GA) (bien qu'il soit intégré à Struts 2.3.16. Je ne lui ai pas donné de essayez avec Spring MVC seul). Il échoue cependant, lorsque la demande est en plusieurs parties pour télécharger des fichiers avec le statut 403. J'ai du mal à trouver une solution pour cela.web.xml
est crucial.MultipartFilter
doit être déclaré avantspringSecurityFilterChain
. J'espère que cela pourra aider. Merci.Réponses:
Il semble que la protection CSRF (Cross Site Request Forgery) de votre application Spring soit activée. En fait, il est activé par défaut.
Selon spring.io :
Donc pour le désactiver:
Si vous souhaitez conserver la protection CSRF activée, vous devez inclure dans votre formulaire le fichier
csrftoken
. Vous pouvez le faire comme ceci:Vous pouvez même inclure le jeton CSRF dans l'action du formulaire:
la source
.csrf().ignoringAntMatchers("/h2-console/**")
Ne devriez-vous pas ajouter au formulaire de connexion ?;
Comme l' indique le ici dans la documentation de sécurité Spring
la source
Si vous postulez,
security="none"
aucun jeton csrf ne sera généré. La page ne passera pas par le filtre de sécurité. Utilisez le rôle ANONYME.Je ne suis pas entré dans les détails, mais cela fonctionne pour moi.
la source
Essayez de changer ceci:
<csrf />
à ceci:<csrf disabled="true"/>
. Il devrait désactiver csfr.la source
Avec thymeleaf vous pouvez ajouter:
la source
Documentation Spring pour désactiver csrf: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure
la source
J'ai déjà eu le même problème.
Votre configuration utilise security = "none" et ne peut donc pas générer _csrf:
vous pouvez définir access = "IS_AUTHENTICATED_ANONYMOUSLY" pour la page /login.jsp remplacer la configuration ci-dessus :
la source
je pense que csrf ne fonctionne qu'avec les formes à ressort
changez en
form:form
tag et voyez cela qui fonctionne.la source
Veuillez consulter mon exemple d'application de travail sur Github et comparer avec votre configuration.
la source
Aucune des solutions n'a fonctionné de moi. Le seul qui a fonctionné pour moi sous forme de printemps est:
action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"
REMPLACÉ PAR:
action = "./ upload? _csrf = $ {_ csrf.token}"
(Spring 5 avec csrf activé dans la configuration java)
la source
Dans votre contrôleur, ajoutez ce qui suit:
Et sur la page jsp, ajoutez
la source