2009-09-26 82 views
0

我正在研究一個允許用戶發送內部消息的應用程序。Spring-Flex BlazeDs多用戶+全球聊天消息系統

我會告訴你目前的設置是什麼,請幫我弄清楚如何使它工作或可能建議另一個角度。我們在Spring中使用BlazeDS。

  • 用戶A偵聽上 消息主題Chat.A
  • 用戶B對消息主題消息Chat.B偵聽消息
  • 兩個用戶偵聽主題聊天全局消息(全系統的消息) .System

所以我們有一個多主題的消費者爲個人消息主題和一個爲全球消息主題。

那麼幾個問題,我有:

  1. 是更好地做到這一點作爲兩個不同的 消費者(共享 相同的處理函數),或者爲一體, 多主題的消費?
  2. 如何檢查客戶端A實際上是否正在偵聽Chat.A,而不是僅知道如何編寫BlazeDS客戶端的其他人?我們安裝了Spring Security,但是如何監聽訂閱請求,並在他們的用戶名(從安全上下文中提取)與他們請求的子主題不匹配的情況下阻止他們?

我也讀過關於選擇器。那麼,這看起來很有希望,但是,我又如何檢查當消費者使用selector="for == A || for == System時,消費者屬於已經被認證爲「for」用戶的客戶端。

  1. 選擇器如何與子主題進行比較/對比?他們每個人的最佳狀況是什麼?

回答

0

我通常爲此使用子主題。但如果你這樣做,確保你disable subscriptions to wildcard subtopics

+0

非常感謝!我用你的例子來做我所需要的。我試圖通過查看對象管理(CommandMessage commandMessage)來檢查訂閱請求(http://livedocs.adobe.com/livecycle/8.2/programLC/programmer/javadoc/flex/messaging/services/messaging/adapters/MessagingAdapter.html )。我將我的安全邏輯移到了allowSubscribe(Subtopic subtopic)方法中,它像一個魅力一樣工作! – davidemm 2009-09-29 16:35:59

+0

通過使用Spring-Flex集成:其中「MyMessagingAdapter」是對bean的引用。在bean(適配器)中,我檢查了子主題,並確保沒有通配符,最低的子主題與從安全上下文中拉取的用戶名匹配:SecurityContextHolder.getContext()。getAuthentication()。getName()) – davidemm 2009-09-29 16:43:52

1

選擇器基本上是一個表達式,您可以使用該表達式來過濾哪些消息將通過消費者分派。根據該文檔,它使用SQL 92條件表達式語法:

http://livedocs.adobe.com/blazeds/1/blazeds_devguide/help.html?content=messaging_6.html

甲副題是排序的選擇器的一種特殊情況的,濾除其郵件「DSSubtopic」報頭不匹配所提供的值。

要理解這兩個重要的事情是,客戶端確定哪些消息發送給它,因此它不能完全依靠安全。

實現基於身份驗證的用戶身份信息安全的基於服務器的過濾,見我的回答一個相關的問題在這裏:

Flex Messaging Security

至於多個消費者與MultiTopicConsumer,不知道有。他們都將使用相同的底層ChannelSet,所以它不應該有很大的性能差異。我認爲這主要是一個問題,即是否有一個事件處理程序可以方便地響應來自MultiTopicConsumer的所有消息,或者是否更容易爲每個Consumer使用單獨的事件處理程序。

+0

謝謝你的回答。有沒有辦法通過適配器或其他東西攔截訂閱請求,並且在那個時候,如果與他們的用戶名不匹配,我們不允許訪問他們請求的主題? – davidemm 2009-09-27 05:35:27