我刚刚添加了一个 ExecutionHandler
按照文档中的建议,在我的主要业务逻辑处理程序之前到我的服务器管道。
我正在使用 Apache Shiro http://shiro.apache.org/为了安全。在我添加 ExecutionHandler
之前它运行良好.
问题:
Shiro 的执行上下文绑定(bind)到您获取 Subject
的当前线程。目的。所以,如果 Subject
在工作线程中获取,但业务逻辑在单独的ExecutionHandler
中执行托管线程,那么就 Shiro 而言,这两个执行上下文将不会连接。因此 Shiro 在 ExecutionHandler
线程将无法意识到 Subject
实际上是经过身份验证的。所以我收到身份验证错误。
可以关联给定的 Subject
与 Runnable
在传递给 Executor.execute()
之前以便维护安全上下文。见:http://shiro.apache.org/subject.html
基于此我认为需要找到一种方法来关联当前 Shiro Subject
与 ExecutionHandler
Runnable
.
我仍在尝试完全理解 ExecutionHandler
和 OrderedMemoryAwareThreadPoolExecutor
实现。
基本上我需要调用subject.associateWith(aRunnable)
就在 aRunnable
之前传递给 Executor.execute(aRunnable)
.
有人对我可以在哪里/如何将 Shiro 加入混音有想法吗?
谢谢,
马特
最佳答案
Shiro 可以为您自动执行线程切换。
您应该可以只使用 SubjectAwareExecutor 之一, SubjectAwareExecutorService , 或 SubjectAwareScheduledExecutorService开箱即用的实现。您可以包装将执行 Runnables 的实际 ExecutorService,这很好。例如:
ExecutorService myExistingExecutorService = //get from somewhere
ExecutorService useThis = new SubjectAwareExecutorService(myExistingExecutorService);
您可以“注入(inject)”或配置
useThis
在您的应用程序中的任何位置创建实例,并且调用代码不需要知道 Shiro 的存在。例如,一个不知道的组件调用
useThis.submit(someRandomRunnable)
不知道 Shiro 正在使用中,但 Shiro 主题仍将跨线程保留。查看相应的 JavaDoc 页面了解更多信息。!
莱斯
关于multithreading - Apache Shiro 集成和 Netty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9900221/