2012-03-28 6 views
6

ドキュメントで推奨されているように、メインビジネスロジックハン​​ドラの直前にサーバーパイプラインにExecutionHandlerを追加しました。Apache Shiro統合とNetty ExecutionHandler/OrderedMemoryAwareThreadPoolExecutor

セキュリティのためApache Shiro http://shiro.apache.org/を使用しています。私がExecutionHandlerを追加するまでうまくいきました。

問題
史郎の実行コンテキストは、あなたがSubjectオブジェクトを取得した現在のスレッドにバインドされています。したがって、Subjectがワーカースレッドで取得され、ビジネスロジックが別のExecutionHandler管理スレッドで実行される場合、2つの実行コンテキストはShiroに関する限り接続されません。したがって、ExecutionHandlerスレッドのShiroは、Subjectが実際に認証されていることに気付かないでしょう。だから私は認証エラーを取得しています。

Runnableと関連付けてからExecutor.execute()に渡すことで、セキュリティコンテキストが維持されるようにすることができます。参照:これに基づきhttp://shiro.apache.org/subject.html

を私はExecutionHandlerRunnableで現在史郎Subjectを関連付ける方法を見つける必要があると思います。

私はまだExecutionHandlerOrderedMemoryAwareThreadPoolExecutorの実装を完全に理解しようとしています。

aRunnableが​​に渡される直前に、基本的にsubject.associateWith(aRunnable)に電話する必要があります。

誰もが城をミックスにどこで/どのようにフックできたかについての考えを持っていますか?

おかげで、 マット

+2

あなたはshiroとNettyをどのように統合したのか興味深いですか?それがopensourceなら、リンクを共有できますか?たぶんgithubの要点としてそれを貼り付けます。 – Abe

答えて

14

史郎はあなたのためのスレッドハンドオフを自動化することができます。

SubjectAwareExecutor,SubjectAwareExecutorService、またはSubjectAwareScheduledExecutorServiceのいずれかの実装をそのまま使用することができます。 Runnablesを実行する実際のExecutorServiceをラップすることができます。たとえば:

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

あなたは「注入」することができたり、アプリケーションのどこにでもuseThisインスタンスを設定し、呼び出し元のコードは、これまで史郎が存在することがわかっている必要はありません。

例えば、useThis.submit(someRandomRunnable)を呼び出す未知のコンポーネントは、Shiroが使用されているとは考えていませんが、Shiro Subjectは依然としてスレッド間で保持されます。詳細は各JavaDocページを参照してください。

HTH!

+1

私は 'SubjectAwareExecutorService'を自分のアプリケーションコンテキストに組み込みました。これに感謝します。それはまさに私が探していたものです。乾杯、マット –