Преамбула
Я разрабатываю шлюз API для федерации микросервисов Grails. Эта проблема связана с рядом проблем, уже зарегистрированных в этом репозитории но ничего не дает решения.
Версии и конфигурации
Грааль: 3.2.2
Кот: 8,5
Версии плагина:
compile 'org.grails.plugins:spring-security-core:3.1.2'
compile "org.grails.plugins:spring-security-rest:2.0.0.M2"
Я использую плагин Spring Security Rest только для аутентификации токена. Я сам выполняю часть авторизации, возвращая ROLE_NO_ROLES
для всех пользователей в getAuthorities()
. Я перехватываю все запросы и разрешаю доступ на основе моей собственной схемы авторизации, хранящейся в БД.
Проблема:
С этими конфигурациями и стратегией мой код работает так, как нужно, когда я запускаю его в своей локальной системе. Когда я его развертываю на сервере как war-файл в tomcat, он отлично работает для всех запросов к шлюзу, т.е. для всех запросов шаблона /umm/controller/action
. Есть контекст безопасности Spring, и пользователь оценивается отлично.
Когда я пытаюсь вызвать другие микросервисы путем перенаправления с запросами вида /umm/microservice/controller/action
, springSecurityService.getCurrentUser()
и springSecurityService?.principal?.username
, начинают возвращаться null. Хотя мой токен отлично оценивается, я не получаю никакого контекста безопасности.
Подробнее см. в этой проблеме а>сильный>. Подробная информация о воспроизведении ошибки также содержится в вышеупомянутом выпуске. Весь проект доступен здесь.
Обновление: 19 мая 2017 г.
Я попытался развернуть свою войну в Tomcat на моей локальной машине. Этот вопрос и этот question предоставляют следующие решения.
- отключение кеша tomcat
- настройка
grails.plugin.springsecurity.sch.strategyName = org.springframework.security.core.context.SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
Кажется, пока ничего не работает. SecurityContextHolder
все равно возвращает null
. Все пользовательские функции извлечения SpringSecurityService
, а именно. getCurrentUser()
, getPrincipal()
, getAuthentication()
и loadCurrentUser()
возвращают значение null.
Обновление: 23 мая 2017 г.
Чтобы сузить проблему, я выполнил автономную войну, используя
java -Dgrails.env=prod -jar build/libs/mywar-0.1.war
Теперь для любого запроса, отличного от umm, я получаю 404, page not found
. Я думаю, что проблема связана с производственной средой. Приложение отлично работает в разработке.
Также попробовал grails run-app
, который отлично работает. Чтобы исключить проблему с производственной средой, я создал войну с помощью grails dev war
, но безрезультатно. На war
пока ничего не работает.
Обновление: 25 мая 2017 г.
Вероятно, мне следует задать этот вопрос http://security.stackexchange.com, но для протокола я задаю его и здесь.
Ответ, предоставленный мной ниже, содержит исправление обходного пути. Механизм, с помощью которого работает исправление, объясняется в ответе. Мой вопрос:
- Приводит ли этот подход к какой-либо уязвимости или лазейке в системе безопасности?
- Безопасна ли эта схема авторизации или ее нужно пересмотреть?
- Я аутентифицируюсь через плагин, но авторизуюсь сам. Может ли кто-нибудь обойти фильтры безопасности и напрямую попасть в перехватчик авторизации? Потому что, если кто-то может это сделать, ему нужно будет только дать мне имя пользователя администратора в том же формате, что и токен, и он будет иметь доступ ко всему.