2016-07-18 5 views
1

現在、Spring Integrationを使用してキューからメッセージを取り出し、サービスアクティベータを使用してサービスに送信しています。私の問題は、私が呼んでいるサービスでは、現在のスレッドのセキュリティコンテキストが必要であるということです。これは、別のBeanの引数のないメソッドhandleAuthentication()を呼び出すことによって設定できます。私は、サービスアクティベータサービスを呼び出す前に、新しいメッセージが受信されるたびにこれを呼び出すのが最善の方法であると思いますか?私はもともとhandleAuthentication()を呼び出す最初のもので2つのサービスアクティベータを連鎖させることを考えていましたが、handleAuthentication()は実際のメッセージからの情報を必要としないので正しくありません。Spring Integrationを使用してメッセージを受信したときにセキュリティ設定を呼び出す方法

答えて

1

はい、セキュリティの取り扱いについてのあなたの前提は正しいです。それは実際にはビジネスロジックと結びついてはならない副作用です。

したがって、私たちはプログラム内で同じ動作をすることができるようなものを使用する必要があります。これはプログラミングでもAspectと呼ばれています。

春のインテグレーションではMessageChannelInterceptorのようなフックがあり、handleAuthentication()preReceive()コールバックに正確に実装することができます。

もう1つのトリックはSecurityContextをターゲットサービスの呼び出しの直前に現在のスレッドに移入する<request-handler-advice-chain>MethodInterceptorの実装で実現できます。

+0

私はpreReceiveとpostReceiveがどのように動作しているかに問題が発生しています。これらのメソッドは、メッセージがあるかどうかに関係なく、チャネルがポーリングされるたびに呼び出されます。実際にメッセージがある場合にのみこれらが呼び出されるアプローチはありますか?それ以外の場合は、常にhandleAuthentication()が呼び出されます。 – user964210

+0

ああ、そうです! 'postReceive()'コールバックで同じことをするのはどうですか? –

+0

'postReceive()'は実際にポーリング時にも常に呼び出されます。私は 'org.springframework.integration.channel.AbstractPollableChannel'の' receive(long timeout) 'メソッドを見てこれを検証しました。メッセージがない場合、コールバックはメッセージのnullを返すだけです。 – user964210

関連する問題