org.apache.shiro.realm.AuthorizingRealm 内の doGetAuthorizationInfo(PrincipalCollection principals) を呼び出したときに表示される UsernamePasswordToken が渡されたのは別のユーザーのものです。
以下のトレースは、私が得ていることを説明しています。
fetching List user1 fetching List user1-role roles for user1 is/are user1-role.. user1 のパーミッション is/are iswapi:service1:, iswapi:service2:..
これらは、AuthorizingRealm のカスタム実装からの出力です。基本的に、私はプリンシパルを取得します:
文字列ユーザー = (文字列) getAvailablePrincipal(principals);
そして、そのユーザーの役割をフェッチします (これにより、 >>> fetching List ..... 行が出力されます)。驚いたことに、実際に呼び出しを行ったユーザーは user2 ですが、印刷されるユーザーは user1 です。
問題は、getAvailablePrincipal(principals) が user2 ではなく user1 を返すのはなぜですか? そのコンテキストの現在の所有者/ユーザーを知るために行うのは正しい呼び出しですか? getAvailablePrincipal(principals) は SHIRO_SECURITY_TOKEN ヘッダーでユーザーを返す必要があると思いますが、これは起こっていません。
いくつかの調査/デバッグの後、Shiro が現在のスレッドのユーザーを取得することに気付きました。
サブジェクト currentUser = SecurityUtils.getSubject();
ただし、問題は camel OSGi にあります。スレッドは常に再利用されるため、再利用されたスレッドに着信する新しいリクエストには、常に最初のスレッドのユーザーが含まれます。
これにより、レルムを実行しているスレッドを印刷すると、スレッドIDとスレッド名がuser1であることがわかりました。したがって、user1 のロールは常に user2 に対して取得されます。
私の仮定が正しい場合、新しいリクエストに対して新しいスレッドを確保するにはどうすればよいですか?
注: 私のキャメル バンドルは、ソース/発信元エンドポイントのスレッドを使用すると思われる direct:vm コンポーネントを使用します。スレッドIDと名前を印刷すると、次のようになります。
スレッド ID: 5944 スレッド名: qtp406786712-5944 スレッド グループ名: spring-osgi-extender[1db479f4]-threads スレッド グループの親名: org.springframework.osgi.extender-1.2.1