質問:
あなたが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
実際には役に立ちません。