2012-03-22 1 views
6

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

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

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

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

ответ

12

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

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

<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> 
+0

Благодарим за сообщение с этим хорошо написанным ответом sma! –

+0

У меня есть вопрос о 'SecurityUtils.getSubject()'. Поскольку в контейнере tomcat есть пул потоков, один поток может быть связан с несколькими субъектами? – znlyj

 Смежные вопросы

  • Нет связанных вопросов^_^