2015-10-25 141 views
2

我想在春季應用中使用websocket進行聯繫請求。我已經爲用戶設置了登錄頁面,我使用彈簧安全。我的問題如下:如何安全地發送Web套接字消息給兩個不同的用戶。多個用戶的春季websocket安全

我知道我可以發送廣播消息到訂閱的一些話題每一個用戶與@SendTo()因爲他的用戶名是存儲在主只能通過類似

messagingTemplate 
    .convertAndSendToUser(principal.getName(), "/queue/requests", request); 

廣播消息給一個用戶。

我的問題是如何處理,當我們不得不從一個請求中定位兩個用戶並使其安全,這樣你就不能只從客戶端收聽任何通道而沒有被授權。

理想我正在尋找類似

messagingTemplate 
    .convertAndSendToUser(request.getFromUser(), "/queue/requests", request) 

messagingTemplate 
    .convertAndSendToUser(request.getToUser(), "/queue/requests", request) 
+0

我認爲你需要Spring Security 4,而Spring Boot使用Spring Security 3 ......「Spring Security 4.0引入了對WebSockets的授權支持」 –

回答

1

春天的WebSocket獲取目標用戶手柄/用戶信道,所以我用這些方法

這就是我解決這個問題的方法:

當用戶使用Spring Security進行身份驗證時,WebSocket模塊會爲該用戶創建唯一的通道基於他的校長。例如"/user/queue/position-updates"被翻譯成"/queue/position-updates-user123"

所以在客戶端的所有我需要做的,是訂閱/user/queue/requests

而在服務器端,將消息發送到/user/{username}/queue/requestsconvertAndSendToUser(request.getFromUser(), "/queue/requests", request)和Spring處理剩下的。

+0

多數民衆贊成我是想告訴你.. :) – MasterCode

0

Spring-websocket-chat如下給出你可以做一些事情。 在客戶端,你可以有/app/chat.private.{targetUser}

在服務器端,您可以通過使用@DestinationVariable和源用戶從Principal

@MessageMapping("/chat.private.{username}") 
    public void filterPrivateMessage(@Payload ChatMessage message, @DestinationVariable("username") String username, Principal principal) { 
     checkProfanityAndSanitize(message); 

     message.setUsername(principal.getName()); 

     simpMessagingTemplate.convertAndSend("/user/" + username + "/queue/chat.message", message); 
    } 
+1

這是不安全的,因爲任何用戶都可以訂閱任何頻道 –

+0

你可以添加websocket的安全性,並通過使用彈簧安全 – MasterCode

+0

給予特定用戶的特定頻道的訪問權限,所以你希望兩個用戶接收消息是不授權的 – MasterCode