Вопрос:
Когда вы UnicastRemoteObject.exportObject(instance)
. Станет ли этот экземпляр общедоступным для всех клиентов? Даже если для поиска порта требуется немного хитрости.
Это ситуация:
У меня есть настройка клиент / сервер Java RMI, и я хотел добавить некоторую аутентификацию. Предоставление клиенту возможности использовать комбинацию user / pass до того, как сработают другие вызовы 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
, но это на самом деле не поможет.