0

EJB 呼び出しに JBoss 4.0.4 (少し古い) で httpinvoker を使用しています。サーバーに呼び出しを行うクライアントが非常に多いため、サーバー内の呼び出しごとにクライアントを識別したいと考えています。

JBoss httpinvoker でこれを行う方法はありますか?

各 HTTP 要求でクライアントを識別するためにヘッダーを追加することは想像できますが、httpinvoker でヘッダーを追加する方法が見つかりません。

4

1 に答える 1

1

監査は名前に基づいて構築されているため、何らかの形で認証スキームに基づいています。

したがって、標準のクライアント認証インフラストラクチャを使用して問題を解決することをお勧めします。これは RMI でも機能し (HTTP にバインドされていません)、ユーザー ID は EJB にも渡されます。

サーバ

  • EJB をsecurity-domain(ejb.jar: META-INF/jboss.xml) に配置します。
  • (conf/login-config.xml);だけのapplication-policy 他のものを使用できます。UsersRolesLoginModuleこれは既定のポリシーであり、既に構成されています。
  • users.properties と roles.properties を ejb.jar ファイル (最上位パッケージ) に追加します。UsersRolesLoginModule
  • ユーザーごとに、自分の名前と (ダミーの) パスワードを users.properties に追加します。

クライアント

  • を実装するコールバック クラスを作成しますjavax.security.auth.callback.CallbackHandler。このコールバックは、認証にユーザーとパスワードが必要な場合に使用されます。
  • を作成しjavax.security.auth.login.LoginContextます。コールバック ハンドラを 2 番目の引数として渡します。login()のインスタンスを呼び出すLoginContext
  • を使用して EJB サーバーに正常に接続します。InitialContext
  • -Djava.security.auth.login.config=.../jboss-4/client/auth.confクライアント起動時に追加

このようにして、ユーザー ID がクライアントから EJB に渡されます (標準認証プロセスの一部として)。getCallerPrincipal()これで、EJB メソッドで、SessionContextインスタンスを呼び出してユーザー ID を取得できるようになりました。これをJBoss 4.2.3に対してテストしました

追加情報: JBoss クライアント認証


補遺1:

RMI または HTTP を使用すると、パスワードは安全な方法で転送されません。この場合、ダミーのパスワードを使用するだけで、監査には問題ありません。

一方、RMI over SSL または HttpInvoker over HTTPS を使用すると、本物で安全な認証にすばやく変更できます。


補遺2:

ロールを定義せずに機能するかどうかはわかりません。おそらくあなたはしなければならない

  • 各ユーザーの roles.properties に行を追加します。たとえば、connect ロールを追加します。
  • ejb-jar.xml にもロール定義を追加します。security-role-ref各 EJB に対して、security-roleおよびmethod-permissionassembly-descriptor

アップデート

すでにログインモジュールがあるため、別の可能性があるかもしれません:

ログインモジュールのソースコードがある場合は、別のモジュールを使用TextCallbackしてクライアントから追加情報 (この場合はユーザー ID) を取得できます。この情報は、カスタム を作成するために使用できますPrincipal。EJB 内では、の結果をgetCallerPrincipal()カスタム プリンシパルにキャストできます。

于 2013-07-24T12:36:30.367 に答える