Wenn ein nicht authentifizierter Client eine URL anfordert, für die eine nicht anonyme Zugriffsebene gemäß Definition in security-config.xml
erforderlich ist, sendet spring security eine HTTP-Umleitung an unsere Anmeldeseite (z. B. /login
). Das ist gut.
Das Problem besteht darin, dass bei Abwesenheit einer vorhandenen Sitzung (identifiziert durch ein Cookie, das in der Kundenanfrage bereitgestellt wird), spring-security eine Umleitung ausgibt, die auch die neue Sitzung des Kunden in der URL angibt, z. /login;jsessionid=8o7pglapojus
.
Viele Container unterstützen dies (anscheinend funktioniert es in Tomcat einwandfrei?), Aber Jetty (was wir gerade verwenden) scheint dies nicht zu tun - die umgeleitete URL gelangt vollständig intakt zu unserem URL-Router (einschließlich der jsessionid
" parameter "), und die angegebene Sitzung ist nicht mit der /login
-Anforderung von jetty/spring-security verknüpft (dh im Set-Cookie-Header der Antwort auf die /login
-Anforderung wird eine völlig neue Sitzungs-ID angegeben).
Wir können das umgehen, indem wir den /login.*
in unseren Routen abgleichen. Ich bin jedoch gespannt, ob es eine Möglichkeit gibt, die Ausgabe der Sitzungs-ID in der Authentifizierungsumleitung zu verhindern.
In Spring Security 3.0.0 M1 oder neuer konnten Sie disable-url-rewriting="true"
im <http>
-Namespace festlegen. Sehen Sie, ob das hilft. Siehe auch diese Feature-Anfrage .
Jetzt sieht es so aus.
<security:http auto-config="false" use-expressions="true" disable-url-rewriting="true">
Danach kann Ihre Anwendung keine stateful-Jobs ordnungsgemäß ausführen.
Da Sie Jetty verwenden, fügen Sie einfach das folgende context-param-Tag in Ihre web.xml ein:
<!-- Disables appending JSESSSIONID in browser address bar/requests -->
<context-param>
<param-name>org.Eclipse.jetty.servlet.SessionIdPathParameterName</param-name>
<param-value>none</param-value>
</context-param>
So habe ich dieses Problem gelöst ...
das Szenario war, dass ich ein paar Sitzungen weniger und Sicherheit = "keine" Seiten hatte, und bei der Weiterleitung nach der Übergabe - die Umleitungs-URL, die verwendet wurde, um angehängt zu werden; Jsessionid = in der URL - natürlich zu Fehlern ...
Ich konnte auch nicht hinzufügen disable-url-rewriting = "true" funktionierte auch nicht.
Was für mich funktionierte, wenn unten Code bei der Einreichung des Formulars eingereicht wurde
HttpSession session = request.getSession();
if (session != null) session.invalidate();
dadurch wurde sichergestellt, dass keine aktive Sitzung vorhanden ist. Dadurch wird sichergestellt, dass die Weiterleitung nach der Übergabe keine Sitzungsinformationen enthalten muss. Daher muss JSESSION nicht zur URL hinzugefügt werden.
Dies war natürlich in meinem speziellen Fall erforderlich .. und kann nicht als generische Lösung für die gesamte Anwendung verwendet werden. Lass es mich wissen, wenn dir das hilft.
Ich habe bereits eine Antwort für bestimmte Anwendungsfälle hinzugefügt - hier gibt es mehrere Möglichkeiten, wie Sie sie angehen können (Zusammenfassung meiner Entdeckungsreise und Experimente).
<sec:http pattern="/<your url pattern>/**" disable-url-rewriting="true"
<%@ page session="false" %>
HttpSession session = request.getSession(); if (session != null) session.invalidate();
Diese Lösungen sind spezifisch für die Federsicherheit. Es gibt andere Lösungen, die auf Tomcat-Ebene ausgeführt werden können
<session-config> <tracking-mode>COOKIE</tracking-mode> </session-config>
In WEB-INF/web.xml
disableURLRewriting = "true"
Hoffe das hilft dir.
Eine andere Lösung ist hier (für die Frühlingssicherheit überhaupt, d. H. Für mich).
http://randomcoder.com/articles/jsessionid-considered-harmful
Erzeugt einen Servlet-Filterwrapper und verwaltet diese.
@ahmet alp balkan:
seamframework bietet eine bessere Lösung als Zufallscodierer. http://seamframework.org/Documentation/RemovingJSESSIONIDAusYourURLsAndFixingScache
@BalusC:
Wenn der Entwickler FilterChainProxy von spring security verwendet hat, um die Sicherheitsfunktion zu implementieren, wird kein http-Namespace verwendet.
Dann konnten wir keine Möglichkeit finden, disable-url-rewriting hinzuzufügen, ohne zu versuchen, einen benutzerdefinierten Filter zur Filterkette hinzuzufügen oder einen unabhängigen Filter in web.xml einzufügen.