2012-03-28 63 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