0

私は問題に直面していて、誰かが私にアドバイスをくれることを願っています. HTTP リクエストを許可する安らかな Spring アプリケーションがあります。私は春のセキュリティを使用しており、oauth2 を提供しています。コントローラーによって呼び出される私の基本的なサービスでは、現在ログインしているユーザーを次の方法で取得しています。

SecurityUser loggedUser = (SecurityUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

これまでのところ、それはすべてうまくいっています。さらに、org.springframework.context.ApplicationListener インターフェイスを実装するイベントとイベント リスナーを使用しています。イベントが非同期的に処理されるようにアプリケーション イベント マルチキャスターを構成しました (SimpleAsyncTaskExecutor を使用)。

リスナーでサービス(および現在ログインしているユーザーに依存するメソッド)を使用しようとすると、(明らかな)問題が発生します。非同期で動作しているため、コンテキストにアクセスできません。したがって、現在のユーザーを取得できません。

問題を解決する方法について何かアドバイスをいただけますか? よりも多くのオプションがありますか

  • 非同期リスナーが引き続きコンテキストにアクセスできるように、何らかの方法でコンテキストを保存および拡張しますか? もしそうなら、それを行う方法は?
  • (サービスが現在のユーザー自体をフェッチするのではなく)パラメーターを介してユーザーを引き渡すようにすべてのサービスメソッドを変更し、そのIDをイベントなどに保存します。

どうもありがとうございました。自分自身

4

1 に答える 1

0

SimpleAsyncTaskExecutor の代わりに DelegatingSecurityContextAsyncTaskExecutor を使用できます。問題は、ユーザーがログインしているときにのみユーザーのコンテキストを取得できることです。

于 2016-05-10T06:49:41.353 に答える