2017-11-02 4 views
0

ラムダ式の内部からBean APIを呼び出そうとしていますが、SessionContextには正しいcaller principalが含まれていません。代わりにanonymousです。Java 8ラムダ内で使用された場合、EJB呼び出しに呼び出し側プリンシパルがありません

このAPIのインターセプタも同じように動作します。

ラムダの内部からBeanが呼び出された場合にのみ発生します。このトピックに関するその他の質問は見つかりませんでした。

私はWildFly 10.0.0を使用しています、休止状態のコア5.0.10(JPA 2.1)あなたのケースでは、ラムダでの実行

+2

はビットコードを表示します。ラムダの様子は?パラレルストリームですか?ラムダが実行される前に、あなたは正しいプリンシパルを持っていますか?メソッドに@RolesAllowedアノテーションを追加して、ラムダ呼び出しの前に実行できることを確認します。 – HRgiger

答えて

1

は、おそらくコードは別のスレッドで実行されることを意味し、セキュリティコンテキストがあるため、通常はスレッドにバインドされていますが、新しいスレッドで非同期タスクを実行すると、親からセキュリティコンテキストを継承しません。つまり、新しいスレッドは何らかの方法で再認証する必要があります。 WildFly 10の場合は、このあなたのラムダにこれを追加した場合に動作するはずです:

org.jboss.security.client.SecurityClient client = SecurityClientFactory.getSecurityClient(); 
client.setSimple("USERNAME", "PASSWORD"); 
client.login(); 
try { 
    bean.call(); 
} finally { 
    client.logout(); 
} 

あなたはElytronでWildFly 11に切り替えた場合、これは利用できるようになります:

final SecurityIdentity identity = org.wildfly.security.auth.server.SecurityDomain.getCurrent().getCurrentSecurityIdentity(); 
identity.runAs(() -> { the-code-you-want-to-run-with-this-identity }); 
関連する問題