Конфиденциальность JMS / MQ между клиентами
Я разрабатываю систему, в которой один сервер должен отправлять сообщения множеству независимых клиентов. Клиенты не знают друг о друге и не должны иметь возможность получать, просматривать или каким-либо другим образом получать информацию о сообщениях друг друга.
Поэтому мне интересно, есть ли у JMS / ActiveMq возможность контролировать, какие клиенты получают какие сообщения?
Я хочу, чтобы все клиенты подключались к одному и тому же провайдеру JSM ("назначение") и использовали только сообщения, предназначенные для них. Это была бы простая установка с точки зрения серверов.
Альтернативой может быть получение конечных точек веб-сервиса от всех клиентов и выполнение ws-вызовов каждый раз, когда сервер получает сообщение для клиента. Я думаю, что этот альтернативный звук "неправильный", так как я считаю, что звонки раздуваются. Каждый ws-вызов требует больших накладных расходов, и этот сервер должен будет выполнять 1000 вызовов каждый день. На мой взгляд, это было бы неоптимальным для сервера...
1 ответ
Краткий ответ: используйте селектор сообщений.
Подробный ответ: в вопросе не упоминается, как начинается разговор. Итак, вот мои ответы для обоих сценариев.
а) Если клиент инициирует разговор (т.е. клиент отправляет сообщение на сервер и ожидает ответа).
Это сценарий запроса / ответа. Messaging/JMS- это разъединенная система связи. Но запрос / ответ - это распространенный шаблон в JMS. Это может быть реализовано с использованием шаблона корреляции.
- Уникальный идентификатор (идентификатор корреляции) отправляется частью сообщения запроса.
- Сервер получает сообщение и устанавливает идентификатор корреляции в ответном сообщении.
- Клиент использует Селектор сообщений, чтобы получить сообщение с правильным идентификатором корреляции.
б) Если сервер инициирует диалог (т. е. Сервер отправляет сообщения клиентам без запроса клиента).
В этом случае аналогичный подход может быть использован.
- Фиксированный идентификатор клиента присваивается каждому клиенту.
- Сервер поддерживает все идентификаторы клиента и устанавливает идентификатор клиента получателя в качестве идентификатора корреляции сообщения.
- Клиент использует Селектор сообщений, чтобы получить сообщение с идентификатором корреляции, равным его идентификатору клиента.
Обновление о конфиденциальности.
Следующая информация, извлеченная из этой ссылки, полезна для понимания безопасности JMS.
JMS не определяет контракт безопасности или API для контроля конфиденциальности и целостности сообщений. Безопасность считается специфичной для JMS-провайдера функцией. Он управляется системным администратором, а не реализуется программно или во время выполнения сервера J2EE.
Двумя основными функциями безопасности JMS являются Аутентификация и Авторизация. Насколько мне известно, безопасность JMS для клиентского доступа фокусируется на защите адресатов JMS (не отдельных сообщений). Пока клиент имеет доступ к пункту назначения, роль безопасности, назначенная ему, применима ко всем сообщениям, принадлежащим пункту назначения.
Основываясь на этом,
Решение 1. Если клиентский код контролируется доверенной стороной.
Следуйте моим решениям в моем первоначальном ответе. Это обеспечит доставку сообщения нужному человеку. Но ничего не защитит, если клиентский код намеренно изменен для получения всех сообщений.
Решение 2. Назначьте каждому клиенту частное назначение и учетную запись пользователя и настройте безопасность так, чтобы учетная запись пользователя клиента могла получить доступ только к своему назначению.
Примечание. Нашел ссылку на "Ограничения для селекторов сообщений для предоставления авторизации на уровне сообщений". Но я думаю, что это особенность, специфичная для поставщика.
Надеюсь, это будет полезно.