webentwicklung-frage-antwort-db.com.de

Wie kann ich verhindern, dass die Frühlingssicherheit angehängt wird: jsessionid = XXX für Anmeldeumleitungen?

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.

31
cemerick

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 .

43
BalusC

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.

8
Naeem

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>

Siehe: Sitzungsverwaltung - Jetty Doc

1
Lucky

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. 

0
Anand Tuli

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). 

  1. @ Gesamtpegel - stellt sicher, dass kein URL-Schreiblevel vorhanden ist

<sec:http pattern="/<your url pattern>/**" disable-url-rewriting="true"

  1. stellt sicher, dass keine Sitzungsinformationen benötigt werden, daher muss keine JSESSSIONID angehängt werden

<%@ page session="false" %>

  1. @ Controller-Ebene - bevor die Seite/URL aufgerufen wird, wird die Sitzung ungültig. Keine Sitzung> Keine Sitzungsinformationen, die zu tragen sind> Keine anhängende JSESSIONID

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 

  1. Ändern des Sitzungsprotokolls in COOKIE, Sitzungsinformationen bereits mit Browser-Cookie.> Keine Notwendigkeit, Informationen in URL zu übergeben.> Kein Anhängen von JSESSIONID [funktioniert nicht, wenn Cookies nicht zulässig sind Chrome mit strengen Cookie-Einstellungen von Drittanbietern]

<session-config> <tracking-mode>COOKIE</tracking-mode> </session-config>

  1. disableURLRewriting auf Webserver-Ebene

In WEB-INF/web.xml disableURLRewriting = "true"

Hoffe das hilft dir. 

0
Anand Tuli

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.

0
AhmetB - Google

@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. 

0
cleverpig