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

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

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

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

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


person sma    schedule 22.03.2012    source источник


Ответы (1)


Так вот, получается, что я просто не правильно настроил Широ. У меня есть веб-приложение, но я настраиваю Security Manager в коде. Это привело к тому, что диспетчер безопасности был настроен только для определенного потока. Пока запросы обслуживались тем же потоком, все работало нормально. Но как только Tomcat выбрал другой поток, пользователь оказался неаутентифицированным.

У Широ есть фильтр для веб-приложений, который обрабатывает этот сценарий и привязывает пользователя к каждому входящему запросу. Ваше приложение должно быть настроено следующим образом, вместо того, чтобы выполнять диспетчер безопасности в коде:

<context-param>
    <param-name>shiroConfigLocations</param-name>
    <param-value>classpath:auth.ini</param-value>
</context-param>

<!--  Shiro Environment Listener -->
<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

<!--  Shiro Filter Configuration -->
<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
person sma    schedule 23.03.2012
comment
Спасибо за отчет с этим хорошо написанным ответом sma! - person Maarten Bodewes; 25.03.2012
comment
У меня есть вопрос о SecurityUtils.getSubject(). Поскольку в контейнере tomcat есть пул потоков, один поток может быть связан с несколькими субъектами? - person znlyj; 22.11.2015