Ist nach der Konfiguration von Spring Security 3.2 _csrf.token
nicht an eine Anforderung oder ein Sitzungsobjekt gebunden.
Dies ist die Federsicherheitskonfiguration:
<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>
Die Datei 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>
Und es rendert das nächste HTML:
<input type="hidden" name="" value="" />
Das Ergebnis ist der HTTP-Status 403:
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
UPDATE Nach einigem Debuggen wird das Anforderungsobjekt in feiner Form von DelegatingFilterProxy ausgegeben, aber in der Zeile 469 von CoyoteAdapter wird request.recycle () ausgeführt. das löscht alle Attribute ...
Ich teste in Tomcat 6.0.36, 7.0.50 mit JDK 1.7.
Ich habe dieses Verhalten nicht verstanden, und es wäre möglich, wenn mich jemand in Richtung eines Anwendungsbeispielkrieges mit Spring Security 3.2 weist, der mit CSRF funktioniert.
spring
spring-security
csrf
csrf-protection
Hugo Robayo
quelle
quelle
spring-security.xml
) mit Spring 4.0.0 RELEASE (GA), Spring Security 3.2.0 RELEASE (GA) (obwohl es in Struts 2.3.16 integriert ist. Ich habe es nicht angegeben versuchen Sie es mit Spring MVC alleine). Es schlägt jedoch fehl, wenn die Anforderung mehrteilig ist, um Dateien mit dem Status 403 hochzuladen. Ich habe Probleme, eine Lösung dafür zu finden.web.xml
entscheidend ist.MultipartFilter
muss vorher deklariert werdenspringSecurityFilterChain
. Hoffentlich hilft das. Vielen Dank.Antworten:
Es sieht so aus, als ob der CSRF-Schutz (Cross Site Request Forgery) in Ihrer Spring-Anwendung aktiviert ist. Eigentlich ist es standardmäßig aktiviert.
Laut spring.io :
So deaktivieren Sie es:
Wenn Sie jedoch den CSRF-Schutz aktiviert lassen möchten, müssen Sie das in Ihr Formular aufnehmen
csrftoken
. Sie können es so machen:Sie können das CSRF-Token sogar in die Aktion des Formulars aufnehmen:
quelle
.csrf().ignoringAntMatchers("/h2-console/**")
Sollten Sie nicht zum Anmeldeformular hinzufügen?;
Wie hier in der Spring-Sicherheitsdokumentation angegeben
quelle
Wenn Sie sich bewerben,
security="none"
wird kein CSRF-Token generiert. Die Seite wird nicht durch den Sicherheitsfilter geleitet. Verwenden Sie die Rolle ANONYM.Ich bin nicht ins Detail gegangen, aber es funktioniert für mich.
quelle
Versuchen Sie dies zu ändern:
<csrf />
in :<csrf disabled="true"/>
. Es sollte csfr deaktivieren.quelle
Mit Thymeleaf können Sie hinzufügen:
quelle
Spring-Dokumentation zum Deaktivieren von csrf: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-configure
quelle
Ich hatte früher das gleiche Problem.
Ihre Konfiguration verwendet security = "none" und kann daher _csrf nicht generieren:
Sie können access = "IS_AUTHENTICATED_ANONYMOUSLY" für die Seite /login.jsp festlegen, die über der obigen Konfiguration ersetzt wird:
quelle
Ich denke, CSRF funktioniert nur mit Frühlingsformen
Wechseln Sie zu
form:form
Tag und sehen Sie, dass es funktioniert.quelle
Bitte sehen Sie sich meine funktionierende Beispielanwendung auf Github an und vergleichen Sie sie mit Ihrer Einrichtung.
quelle
Keine der Lösungen hat bei mir funktioniert. Das einzige, was in der Frühlingsform für mich funktioniert hat, ist:
action = "./ upload? $ {_ csrf.parameterName} = $ {_ csrf.token}"
ERSETZT MIT:
action = "./ upload? _csrf = $ {_ csrf.token}"
(Spring 5 mit aktiviertem CSRF in Java-Konfiguration)
quelle
Fügen Sie in Ihrem Controller Folgendes hinzu:
Und auf jsp Seite hinzufügen
quelle