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