Основной способ, которым я понимаю, что SecurityUtils.getSubject()
Широ работает, заключается в том, что он возвращает тему, которая привязана к текущему выполняющемуся потоку. Однако это кажется несовместимым с контейнером сервлетов, таким как Tomcat, который использует пул потоков для обслуживания запросов.
Если Tomcat использует ThreadA для обработки запросов, любые вызовы SecurityUtils.getSubject()
должны работать нормально. Но как только ThreadB выбран, пользователь теряется, getSubject
возвращает null, а isAuthenticated теперь false. Это даже при том, что пользователь все еще вошел в систему.
Я подтвердил это в своем заявлении. Я использую Shiro Core 1.2 и замечаю, что мой пользователь чудесным образом не аутентифицируется, когда я перемещаюсь по моему приложению. Если я посмотрю журналы, проблема возникает, как только для обслуживания запроса используется другой поток.
Значит, у меня Широ неправильно настроен? Кажется, что «текущий пользователь» должен быть привязан к чему-то более продолжительному, чем текущий поток. Я ожидаю, что это будет основано на сеансе. Я знаю, что у Широ есть управление сессиями, но во всех найденных мной примерах говорится, что нужно получить текущего пользователя, вызвав getSubject
, который просматривает ThreadContext. Я что-то пропустил?