Широ в многопоточной среде

Основной способ, которым я понимаю работу Shiro SecurityUtils.getSubject(), заключается в том, что она возвращает субъект, который привязан к текущему выполняющемуся потоку. Однако это кажется несовместимым с контейнером сервлетов, таким как Tomcat, который использует пул потоков для обслуживания запросов.

Если Tomcat использует ThreadA для обработки запросов, любые вызовы SecurityUtils.getSubject()должны работать нормально. Но как только ThreadB выбран, пользователь теряется, getSubjectвозвращает null, а isAuthenticated теперь false. И это несмотря на то, что пользователь все еще вошел в систему.

Я подтвердил это в своем приложении. Я использую Shiro Core 1.2 и замечаю, что мой пользователь чудесным образом не аутентифицируется, когда я перемещаюсь по моему приложению. Если я посмотрю журналы, проблема возникает, как только для обслуживания запроса используется другой поток.

Значит, Широ неправильно настроен? Кажется, что «текущий пользователь» должен быть привязан к чему-то более продолжительному, чем текущий поток. Я ожидаю, что это будет основано на сеансе. Я знаю, что у Shiro есть управление сеансом, но во всех найденных мной примерах говорится, что нужно получить текущего пользователя, вызвав getSubject, который просматривает ThreadContext. Я что-то упустил?

7
задан sma 15 February 2018 в 13:01
поделиться