Является ли Spring's SwitchUserFilter Thread Безопасным? - PullRequest
0 голосов
/ 29 августа 2018

Я недавно реализовал SwitchUserFilter в своем приложении Spring (4.3.17). Хотя изначально все выглядело так, как будто все идет хорошо, мы начали сталкиваться с ошибками 403 Access Denied или внезапно перенаправляться на нашу страницу входа после выхода из олицетворения и затем пытаться повторно выдать себя за того же или за альтернативного пользователя.

Я потратил целых 3 дня на это и отладил в глубине Spring на этом этапе, сосредоточившись в основном на цепочке фильтров и аутентификации, чтобы попытаться понять, что происходит. Я обнаружил, что мы сталкиваемся со следующим сценарием:

  1. Администратор олицетворяет собой обычного пользователя
  2. Пользователь администратора завершает олицетворение до полной загрузки страницы (запросы AJAX ожидают)
  3. Администратор правильно перенаправлен на SwitchUserFilter выход targetUrl ... на этом этапе все средства безопасности / аутентификации / роли Spring выглядят правильно в цепочке фильтров, сеансе и SecurityContext.contextHolder. Тогда ...
  4. Spring начинает обрабатывать Ajax-запрос, начиная с шага 2 выше.
  5. Spring загружает аутентификацию для отложенного запроса из сеанса и является аутентификацией олицетворенного пользователя .
  6. Spring обрабатывает запрос, аутентифицируется, поскольку он видит текущий сеанс как сеанс пользователя, а цепочка фильтров обновляет SecurityContext с помощью олицетворенного сеанса .

На этом этапе пользователь-администратор сидит на странице только для администратора, но за кулисами Spring перезаписал аутентификацию SecurityContext пользователя. Теперь, если администратор пытается перезагрузить страницу, он перенаправляется на страницу входа администратора. Если они пытаются выдать себя за другого, они видят общий 403.

Мне кажется, что единственный способ выполнить шаг 5 - это если Spring загрузил аутентификацию пользователя из сеанса, а затем пользователь завершил олицетворение, и Spring восстановил аутентификацию администратора в сеансе, и, наконец, Spring завершил обработку (устаревшего) Аутентификация сеанса пользователя и, в конечном счете, перезаписывает аутентификацию сеанса администратора с пользователем.

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

...