簡體   English   中英

Shiro處於多線程環境中

[英]Shiro in a multi-threaded environment

我理解Shiro的SecurityUtils.getSubject()工作的基本方法是返回綁定到當前正在執行的線程的主題。 但是,這似乎與像Tomcat這樣使用線程池來處理請求的servlet容器不一致。

如果Tomcat說使用ThreadA來處理請求,那么對SecurityUtils.getSubject()任何調用都應該可以正常工作。 但是,一旦選擇了ThreadB,用戶就會丟失, getSubject將返回null並且isAuthenticated現在為false。 這是即使用戶仍然登錄。

我已在我的申請中證實了這一點。 我正在使用Shiro Core 1.2,並注意到當我瀏覽我的應用程序時,我的用戶只是奇跡般地未經驗證。 如果我查看日志,只要使用不同的線程來處理請求,問題就會發生。

那么,我是否錯誤地配置了Shiro? 似乎'當前用戶'應該被綁定到比當前線程更持久的東西。 我希望它是基於會話的。 我知道Shiro有會話管理,但在我發現的所有例子中,它都說通過調用getSubject獲取當前用戶,后者查看ThreadContext。 我錯過了什么嗎?

所以,事實證明我沒有正確配置Shiro。 我有一個Web應用程序,但我在代碼中設置了安全管理器。 這導致安全管理器僅在某個線程上設置。 只要請求由同一個線程提供服務,它就可以正常工作。 但是一旦Tomcat選擇了不同的線程,用戶就會出現在身份驗證中。

Shiro有一個用於處理此場景的Web應用程序的過濾器,並將用戶綁定到每個傳入請求。 您應該按如下方式配置應用程序,而不是在代碼中執行安全管理器:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM