2012-03-28 65 views
6

我剛在我的服務器管道中添加了一個ExecutionHandler,就在我的主要業務邏輯處理程序之前,正如文檔中所建議的那樣。Apache Shiro集成和Netty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor

爲了安全起見,我使用Apache Shiro http://shiro.apache.org/。它工作得很好,直到我加入了ExecutionHandler

問題
四郎的執行上下文被綁定到你獲得Subject對象當前線程。因此,如果在工作線程中獲得Subject,但業務邏輯在獨立的ExecutionHandler託管線程中執行,則兩個執行上下文不會連接到Shiro所關注的位置。因此,在ExecutionHandler線程中的Shiro將不會意識到Subject實際上已被認證。所以我得到認證錯誤。

將給定的SubjectRunnable關聯起來,然後將其傳遞給Executor.execute()以便保持安全上下文是可能的。請參閱:http://shiro.apache.org/subject.html

基於此,我認爲需要找到一種方法來將當前Shiro SubjectExecutionHandlerRunnable相關聯。

我仍試圖完全理解ExecutionHandlerOrderedMemoryAwareThreadPoolExecutor的實現。

基本上我需要在aRunnable傳遞給​​之前撥打subject.associateWith(aRunnable)

有沒有人有想過在何處/如何將四郎掛入混音?

謝謝, 馬特

+2

看看你如何整合shiro和Netty會很有趣。如果它是開源的,你能分享鏈接嗎?也許粘貼它作爲github的要點。 – Abe 2012-05-14 06:45:13

回答

14

四郎可以自動爲你的線程切換。

您應該可以使用開箱即用的SubjectAwareExecutor,SubjectAwareExecutorServiceSubjectAwareScheduledExecutorService實現中的一個。你可以包裝將執行Runnables的實際ExecutorService,並且你很好。例如:

ExecutorService myExistingExecutorService = //get from somewhere 
ExecutorService useThis = new SubjectAwareExecutorService(myExistingExecutorService); 

你可以「注入」或應用程序的任何地方配置useThis實例,調用代碼不會永遠需要知道四郎存在。

例如,一個不知道的組件調用useThis.submit(someRandomRunnable)不知道Shiro正在使用,但Shiro主體仍然保留在線程中。查看更多相關的JavaDoc頁面。

HTH!

Les

+1

我在我的應用程序上下文中連接了'SubjectAwareExecutorService',現在一切正常。非常感謝。這正是我所期待的。乾杯,馬特 – 2012-03-28 14:21:44