Конфликт между весенней безопасностью и базовой авторизацией Tomcat - PullRequest
2 голосов
/ 28 октября 2010

Кто-нибудь сталкивался с проблемой входа в Spring Spring, когда базовая авторизация активирована под Tomcat?

Невозможно войти, когда страница входа загружена после выхода. Если вы обновите страницу и повторите попытку, все в порядке:) (.

1 Ответ

5 голосов
/ 01 марта 2011

Я не мог найти жалоб на такое поведение и потратил целый день, чтобы выяснить проблему. Наконец, выяснилось, что причиной является ошибка в Tomcat, которая доступна в версиях с 6.0.20 по 6.0.28 ( Ошибка 49598 ).

Проблема в том, что и базовая авторизация Tomcat, и безопасность Spring заменяют сеанс во время запроса авторизации. Поскольку выход из системы делает недействительным сеанс, прямой запрос входа в систему после запуска обеих замен сеанса во время одной и той же обработки запроса. Но в результате ошибки заголовок Set-Cookie в ответе остается указывать на идентификатор сеанса, предоставленный Tomcat (который становится недействительным из-за безопасности Spring, поскольку он работает после). Итак, следующий запрос отправляет куки уже уничтоженной сессии. И сеанс, созданный Spring (который содержит подписанного пользователя), остается невостребованным.

Лучшее решение - Tomcat 6.0.29 :-). Если у кого-то есть проблемы с обновлением Tomcat, есть 3 способа избежать ошибки:

  1. Отключить замену сеанса Tomcat. Вы можете сделать это, настроив Valve в context.xml

    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
                                   changeSessionIdOnAuthentication="false"/>
    
  2. Отключить сессионную замену безопасности Spring при настройке security.xml.

    <http ... session-fixation-protection="none">
         .....
    </http>
    
  3. Обеспечить дополнительное перенаправление после выхода из системы. Таким образом, Tomcat будет кэшировать Принцип в сеансе во время запроса на вход.

Может быть, это защищает кого-то от сумасшествия, как я вчера :) 1025 *

С уважением, Эдгар

...