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 Subject与ExecutionHandler Runnable.
我仍然试图完全理解ExecutionHandler和OrderedMemoryAwareThreadPoolExecutor实现.
基本上我需要subject.associateWith(aRunnable)在aRunnable传递之前调用Executor.execute(aRunnable).
有没有人想过我在哪里/怎么把Shiro挂钩?
谢谢,马特
Les*_*ood 14
Shiro可以为您自动执行线程切换.
您应该可以直接使用SubjectAwareExecutor,SubjectAwareExecutorService或SubjectAwareScheduledExecutorService实现之一.你可以包装将执行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!
莱斯