2014-05-21 19 views
6

我創建了一個使用彈簧4的websockets機制的簡單應用程序。 我在我的應用程序中使用了一個activemq代理。春天websocket與跺腳安全 - 每個用戶可以訂閱任何其他用戶的隊列?

在我簡單的測試,我的一個名爲「Alejando」用戶創建10條消息(用戶/亞歷杭德羅/隊列/問候)

當我用「Alejando」登錄並訂閱該隊列:

stompClient.subscribe('/user/alejandro/queue/greetings', function(greeting){ 
        showGreeting(JSON.parse(greeting.body).content); 
    }); 

我確實收到了alejandro的10條消息。

問題是,當我用名爲「evilBart」的不同用戶登錄並訂閱alejandro的隊列時,我也收到了消息?

我該如何執行安全性?我希望用戶只能訂閱它自己的隊列。

謝謝!

我的配置類:

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

@Override 
public void configureMessageBroker(MessageBrokerRegistry config) { 
    config.enableStompBrokerRelay("/queue/","/topic","/user/");  
    config.setApplicationDestinationPrefixes("/app"); 
} 

@Override 
public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/hello").withSockJS(); 
} 

} 

回答

1

入住此similar question:你必須進行身份驗證使用Spring安全通過HTTP的用戶,然後將消息發送到使用SimpMessageTemplate.convertAndSendToUser()方法的用戶。

+1

但是,沒有按真的沒有幫助。當你使用'SimpMessageTemplate.convertAndSendToUser'時,如果你看看代碼,它實際上只是前綴'/ user/{username}',然後使用'SimpMessageTemplate.convertAndSend'方法。它實際上並沒有解決安全問題。 – Nitroware

+0

是的,它的確如此:這是一個特殊的隊列,用戶的唯一sessionId被附加到目標並被代理透明地刪除。嘗試並驗證只有發起用戶能夠接收發送到那裏的消息:所有其他客戶不是。 –

+0

看看我的例子中的更多細節和代碼在這裏:也許我失去了一些東西http://stackoverflow.com/questions/25004081/springmvc-websockets-messaging-user-authentication-with-spring-security |如果你是對的,我只會將我的問題作爲重複來解決。 – Nitroware

1

您可以選擇兩個選項。

  1. 只需從config.enableStompBrokerRelay中刪除「/ user /」即可。彈簧消息將自動添加前綴。

    convertAndSendToUser不適用於代理中繼。

See org.springframework.messaging.simp.user packages source



默認用戶前綴爲 '/用戶/'。 你可以用config.setUserDestinationPrefix(修改)





2.覆蓋兩種方法,並從ChannelInterceptor

處理它

方法:

  • configureClientInboundChannel
  • configureClientOutboundChannel
  • 相關問題