Apache Shiro集成和Netty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor

Mat*_*man 6 multithreading shiro netty

我刚刚ExecutionHandler在我的主业务逻辑处理程序之前添加了一个到我的服务器管道,如文档中所建议的那样.

我使用Apache Shiro http://shiro.apache.org/来保证安全.它工作正常,直到我添加了ExecutionHandler.

问题:
Shiro的执行上下文绑定到您获取Subject对象的当前线程.因此,如果Subject在工作线程中获得,但业务逻辑在单独的ExecutionHandler托管线程中执行,那么就Shiro而言,两个执行上下文将不会连接.因此,ExecutionHandler线程中的Shiro 将无法意识到Subject事实上已经过身份验证.所以我收到身份验证错误.

可以在给予之前将给定Subject与之关联Runnable,Executor.execute()以便维护安全性上下文.请参阅:http://shiro.apache.org/subject.html

基于此,我认为需要找到一种方法将当前的Shiro SubjectExecutionHandler Runnable.

我仍然试图完全理解ExecutionHandlerOrderedMemoryAwareThreadPoolExecutor实现.

基本上我需要subject.associateWith(aRunnable)aRunnable传递之前调用Executor.execute(aRunnable).

有没有人想过我在哪里/怎么把Shiro挂钩?

谢谢,马特

Les*_*ood 14

Shiro可以为您自动执行线程切换.

您应该可以直接使用SubjectAwareExecutor,SubjectAwareExecutorServiceSubjectAwareScheduledExecutorService实现之一.你可以包装将执行Runnables的实际ExecutorService,你很好.例如:

ExecutorService myExistingExecutorService = //get from somewhere
ExecutorService useThis = new SubjectAwareExecutorService(myExistingExecutorService);
Run Code Online (Sandbox Code Playgroud)

您可以useThis在应用程序的任何位置"注入"或配置实例,并且调用代码不需要知道Shiro存在.

例如,一个不知道的组件调用useThis.submit(someRandomRunnable)不知道Shiro正在使用,但Shiro Subject仍将保留在线程之间.查看相应的JavaDoc页面以获取更多信息.

HTH!

莱斯