2010-08-07 117 views
1

我正在設計一個系統,其中一個服務器必須將消息發送到大量獨立客戶端。客戶不相互瞭解,不應該消費,偷看或以任何其他方式獲取關於其他消息的知識。客戶端之間的JMS/MQ機密

因此,我想知道JMS/ActiveMq是否有能力控制哪些客戶端獲得哪些消息?

我想要所有的客戶端連接到相同的JSM提供商('目的地')和消費只爲他們的消息。從服務器的角度來看,這將是一個簡單的設置。

另一種方法是從所有客戶端獲取webservice端點,並在服務器每次收到客戶端消息時執行ws-calls。我認爲這個替代的聲音「錯誤」,因爲我認爲ws電話臃腫。每個ws通話都有一個很大的開銷,而且這臺服務器每天必須撥打1000個電話。在我看來,這將是服務器不理想的...

回答

1

簡短的回答:使用Message selector

詳細回答: 該問題沒有提到如何啓動對話。所以在這裏我的答案都是兩種情況。

a)如果客戶端啓動對話(即客戶端向服務器發送消息並等待回覆)。

這是一個請求/回覆場景。消息/ JMS是一個分離的通信系統。但是request/reply是JMS中的一種常見模式。它可以使用相關模式來實現。

  • 一個唯一的標識符(correlation id)被髮送到請求消息的一部分。
  • 服務器收到消息並在回覆消息中設置相關標識。
  • 客戶端使用消息選擇器以正確的相關ID接收消息。

B)如果服務器發起會話(即服務器將消息發送到客戶端,而客戶端請求)。

在這種情況下,可以使用類似的方法。

  • 固定客戶端ID分配給每個客戶端。
  • 服務器維護所有客戶端ID並將收件人的客戶端ID設置爲消息的相關ID。
  • 客戶端使用消息選擇器接收具有相關ID等於其客戶端ID的消息。

關於機密性的更新。

以下信息是從this link中提取出來的,有助於您理解JMS security

JMS沒有指定一個安全 合同或控制 消息機密性和完整性的API。 安全性被認爲是JMS提供程序特定功能的 。它是由系統管理員 控制的 ,而不是以編程方式或通過J2EE服務器 運行時實現 。

JMS安全性的兩個主要功能是身份驗證和授權。據我所知,JMS針對客戶端訪問的安全性側重於保護JMS目標(而不是單個消息)。只要客戶端有權訪問目標,分配給客戶端的安全角色就適用於屬於目標的所有消息。

在此基礎上,

解決方法1:如果客戶端代碼由可信方控制。

按照我原來的答案我的解決方案。 這將確保郵件傳遞給合適的人。但如果客戶端代碼被故意修改爲接收所有消息,則不會保護任何內容。

解決方案2:爲每個客戶端分配私有目標和用戶帳戶並配置安全性,以便客戶端的用戶帳戶只能訪問其目標。

注意:找到一個關於"Restrictions for message selectors to provide message level authorization"的鏈接。但我認爲這是一個供應商特定的自定義功能。

希望這會有所幫助。

+0

謝謝! 但是如何保密?其他客戶不能「選擇」屬於其他客戶的消息嗎? – 2010-08-14 05:00:47

+0

@ user376803請閱讀更新。 – Sujee 2010-08-16 02:33:35