Как я могу предотвратить добавление Spring-Security, jsessionid = XXX для перенаправления входа? - PullRequest
31 голосов
/ 18 февраля 2010

Когда клиент, не прошедший проверку подлинности, запрашивает URL-адрес, который требует неанонимного уровня доступа, определенного в security-config.xml, Spring Security отправляет HTTP-перенаправление на нашу страницу входа (например, /login). Это нормально.

Проблема заключается в том, что при отсутствии существующего сеанса (идентифицируемого cookie-файлом, предоставленным в запросе клиента), Spring-Security создает перенаправление, которое также указывает новый сеанс клиента в URL-адресе, например, /login;jsessionid=8o7pglapojus.

Многие контейнеры поддерживают это (по-видимому, он прекрасно работает в tomcat?), Но похоже, что Jetty (что мы сейчас и используем) не поддерживает - перенаправленный URL-адрес доходит до нашего маршрутизатора URL-адреса полностью без изменений (включая jsessionid «параметр»), и указанный сеанс не связан с запросом /login посредством jetty / spring-security (т. е. в заголовке Set-Cookie ответа на * 1010 предоставляется совершенно новый идентификатор сеанса * запрос).

Мы можем обойти это, сопоставив /login.* в наших маршрутах, но мне любопытно, есть ли способ предотвратить отправку идентификатора сеанса в перенаправлении аутентификации для начала.

Ответы [ 7 ]

43 голосов
/ 18 февраля 2010

В Spring Security 3.0.0 M1 или новее вы можете установить disable-url-rewriting="true" в пространстве имен <http>.Посмотрите, поможет ли это.Также смотрите этот запрос функции .

8 голосов
/ 01 сентября 2011

Теперь это выглядит так.

<security:http auto-config="false" use-expressions="true" disable-url-rewriting="true">

После этого ваше приложение не сможет правильно выполнять задания с сохранением состояния.

1 голос
/ 06 мая 2016

Поскольку вы используете jetty, просто добавьте следующий тег context-param в ваш файл web.xml,

<!-- 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>

См .: Управление сессиями - Jetty Doc

0 голосов
/ 28 сентября 2018

Я уже добавил ответ на этот вопрос для конкретных случаев использования - вот несколько способов, с помощью которых вы можете справиться с этим (суммируя мое путешествие по открытию и эксперименты)

  1. @ общий уровень - гарантирует отсутствие перезаписи URL

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

  1. гарантирует, что информация о сеансе не нужна, следовательно, нет необходимости добавлять JSESSSIONID

<%@ page session="false" %>

  1. @ Уровень контроллера - перед отправкой на страницу / URL сделать сеанс недействительным. Нет сеанса> Нет информации о сеансе для переноса> Нет добавления JSESSIONID

HttpSession session = request.getSession(); if (session != null) session.invalidate();

Эти решения относятся к безопасности пружин. Есть и другие решения, которые можно сделать на уровне Tomcat

  1. изменение отслеживания сеанса на COOKIE, информация о сеансе уже есть в файле cookie браузера> Нет необходимости передавать информацию в URL> Нет добавления JSESSIONID [не работает, когда файлы cookie запрещены, я столкнулся с проблемой браузеров Safari / Opera + Chrome со строгими настройками файлов cookie сторонних производителей]

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

  1. отключить перезапись на уровне веб-сервера

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

Надеюсь, это поможет вам.

0 голосов
/ 28 сентября 2018

Вот как я решил эту проблему ...

сценарий состоял в том, что у меня было несколько сеансов меньше и безопасность = "нет" страниц и при перенаправлении пост-отправки - URL-адрес перенаправления, к которому добавлялись; Jsessionid = в URL-адресе - конечно, приводил к ошибкам ...

Кроме того, я не мог добавить disable-url-rewriting = "true", также не работал.

Что сработало для меня, если код указан ниже при отправке формы-заявки

HttpSession session = request.getSession();
if (session != null) session.invalidate();

это обеспечило отсутствие активного сеанса - это гарантирует, что пружина при перенаправлении после отправки не должна переносить информацию о сеансе, следовательно, нет необходимости добавлять JSESSION в URL.

Это, конечно, было необходимо в моем конкретном случае ... и не может использоваться в качестве общего решения для всего приложения. Дайте мне знать, если это поможет вам.

0 голосов
/ 24 декабря 2011

@ Ahmet Alp Balkan:

структура шва обеспечивает лучшее решение, чем случайные кодеры. http://seamframework.org/Documentation/RemovingJSESSIONIDFromYourURLsAndFixingScache

@ BalusC:

Если разработчик использовал FilterChainProxy Spring Security для реализации функции безопасности, просто не использовал пространство имен http.

Тогда мы не могли бы найти способ добавить disable-url-rewriting без попытки добавить собственный фильтр в цепочку фильтров или вставить независимый фильтр в web.xml.

0 голосов
/ 10 августа 2010

Здесь есть еще одно решение (для всех Spring Security, то есть для меня самого)

http://randomcoder.com/articles/jsessionid-considered-harmful

Создает обертку фильтра Servlet и управляет обработчиками.

...