3

私は jboss remoting 2.5.4.SP3 を使用して、Web アプリと他の JBoss インスタンスの両方から JBoss 7.1 サーバーの EJB へのリモート アクセスを提供しています。JBoss 7.1 でのリモート EJB アクセスに関する問題、具体的には (それだけでなく) 複数のサーバーで同じ (インターフェース) Bean に同時にアクセスできないため、手動で行っています。remoting3 にはドキュメントがないため、remoting2 を使用しています。

ソケット トランスポートを使用して TransporterHandle/TransporterClient を使用してリモート処理を行っていますが、このリモート接続を介して呼び出されるメソッドでは、サーバーが ejbContext からプリンシパルをルックアップしようとしています。プリンシパルまたはその他のコンテキスト セキュリティ/ID 情報を手動で設定する方法が見つかりません。限界では、ejb メソッドが呼び出されたときにプリンシパルを設定するだけで十分です (着信呼び出しはすべてローカル EJB3 Bean に対して行われます)。または、EJBContext 用に特別に設定することさえできます。

Spring (私は使用していません) に関する多くの情報を見つけましたが、私の特定のコンテキストに一致するものはないようです。

4

3 に答える 3

1

そして今、これを行う正しい方法:

クライアント側では、セキュリティ コンテキストを取得し、セキュリティ ドメインとサブジェクト情報をパッケージ化して、呼び出しとともにサーバーに転送します。SecurityDomain は文字列で、SubjectInfo はシリアライズ可能です。

Map m = new HashMap();
SecurityContext securityContext = SecurityContextAssociation.getSecurityContext();
if (securityContext != null) {
    m.put("SUBJECT-INFO", securityContext.getSubjectInfo());
    m.put("SECURITY-DOMAIN", securityContext.getSecurityDomain());
}
response = remotingClient.invoke(request, m);

マップ m は、jboss リモーティングを介した呼び出しで送信されます。サーバー側では、セキュリティ情報を抽出し、呼び出しのコンテキストを次のように設定します。

SecurityContext oldContext = SecurityContextAssociation.getSecurityContext();
SubjectInfo si = (SubjectInfo) invocation.getRequestPayload().get("SUBJECT-INFO");
String domain = (String) invocation.getRequestPayload().get("SECURITY-DOMAIN");
if (si != null) {
    SecurityContext sc = new JBossSecurityContext(domain);
    sc.setSubjectInfo(si);
    SecurityContextAssociation.setSecurityContext(sc);
}
try {
    return super.invoke(invocation);
} finally {
    SecurityContextAssociation.setSecurityContext(oldContext);
}

魔法のように動作します!

于 2012-05-19T01:24:52.030 に答える
0

私が望んでいた一般的な方法ではありませんが、根本的な問題を解決しました。

すべての着信要求にサーブレット フィルターを適用し、request.getUserPrincipal をスレッド ローカルに記録します。次に、非 EE コードでこれにアクセスし、要求を行っているプリンシパルを見つけることができます。次に、アプリサーバーを呼び出すときに、JBoss Remoting の機能を使用してメタデータを各呼び出しに添付し、プリンシパルをネットワーク経由で渡します。これを行うには TransporterClient をコピーする必要がありました。これはプライベート コンストラクターなどであり、(接続ごとではなく) 要求ごとのメタデータをアタッチするために必要な機能をオーバーライドできないためです。サーバー側では、着信プリンシパルを受け取り、それをスレッド ローカルに設定します。次に、EJBContext.getCallerPrincipal にアクセスする後続のコードで、受信したプリンシパルをスレッド ローカルからルックアップし、それが null でない場合 (したがって、リモート EJB 呼び出し中)、呼び出し元のプリンシパルが匿名の場合に使用します。匿名でない場合は、着信後に何らかの方法で設定されているはずなので、その場合は着信プリンシパルを無視します。

全体として、私が望んでいたよりもはるかに専門的なソリューションであり、JBoss 7.1 で一般的なコンテキストの伝播をネットワーク経由で行う方法については何の光も当てていません。

于 2012-05-18T00:28:49.123 に答える
0

jboss-ejb-client.propertiesを見てください。リモート クライアントを使用して EJB をルックアップするクイックスタートの例もあります。

于 2012-05-17T21:48:26.057 に答える