2

質問:

あなたがUnicastRemoteObject.exportObject(instance)。そのインスタンスは、すべてのクライアントに対して公開されるようになりましたか。ポートを見つけるのに少し注意が必要ですが。

これは状況です:

Java RMI クライアント/サーバーのセットアップがあり、認証を追加したいと考えていました。他の RPC 呼び出しが機能する前に、クライアントがユーザー/パス コンボを使用できるようにします。

オンラインで簡単な提案を見つけましたが、最初は良いアイデアのように見えました。

interface LoginService implements Remote {
  public MainService login(String username, char[] password) throws RemoteException;
}

interface MainService implements Remote {
  /* all my real rpc calls go here */
}

アイデアは、リモート オブジェクトを作成して、RPC への認証後のアクセスを具現化することです。そして、認証を行う最初の層を介してアクセスします。

LoginServiceImpl.login()そのようなものを見なければなりません。

public MainService login(String username, char[] password) throws RemoteException {
  /* verify username and password */
  MainService service = new MainServiceImpl();
  MainService stub = UnicastRemoteObject.exportObject(service, 0);
  return stub;
}

したがって、呼び出す各クライアントlogin()は、 の専用のリモート インスタンスを取得しますMainService。当然、プレーンテキストのパスワードを保護するために、すべてを ssl でラップします。

これが問題です:

新しいインスタンスをエクスポートした後MainServiceImpl、公開されたようです。何を探すべきかを知っている他のクライアントは、それに接続してそのMainServiceImplインスタンスを呼び出すことができます。

作成後に MainService をエクスポートする必要があります。そうしないと、RMI がスタブをクライアントに送信しません。代わりに、MainService インスタンスをシリアル化しようとします。

ユーザー名を に貼り付けることもできますが、MainService実際には役に立ちません。

4

2 に答える 2

0

クライアント認証を使用する SSL は、この問題を解決します。

于 2011-07-10T05:05:05.833 に答える
0

JRMP (RMI ワイヤ プロトコル) に切り替える前に、認証を行う必要があります。これには JSR がありましたが、投票で否決されました。JERIはJINIのためにそれをします。

于 2009-10-09T03:18:05.747 に答える