2014-05-21 31 views
6

Tôi đã tạo một ứng dụng đơn giản sử dụng cơ chế websockets của mùa xuân 4. Tôi sử dụng trong ứng dụng của mình là nhà môi giới activemq.Spring websocket với bảo mật stomp - mọi người dùng đều có thể đăng ký bất kỳ hàng đợi người dùng nào khác?

Trong thử nghiệm đơn giản của tôi tạo ra 10 tin nhắn cho một người dùng có tên "Alejando" (user/alejandro/đợi/lời chào)

Khi tôi đăng nhập với "Alejando" và đăng ký xếp hàng rằng:

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

Tôi thực sự nhận được tất cả 10 tin nhắn đã được enqued cho alejandro.

Vấn đề là khi tôi đăng nhập bằng một người dùng khác có tên "evilBart" và đăng ký hàng đợi của alejandro tôi cũng nhận được thư?

Tôi có thể thực thi bảo mật cho điều đó bằng cách nào? Tôi muốn rằng người dùng chỉ có thể đăng ký hàng đợi của chính nó.

Cảm ơn!

lớp cấu hình của tôi:

@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(); 
} 

} 

Trả lời

1

Kiểm tra này similar question: bạn phải xác thực người dùng thông qua HTTP sử dụng Spring Security, và sau đó gửi thông điệp tới người dùng bằng cách sử dụng phương pháp SimpMessageTemplate.convertAndSendToUser().

+1

Nhưng điều đó không 't thực sự giúp đỡ. Khi bạn sử dụng 'SimpMessageTemplate.convertAndSendToUser', nếu bạn nhìn vào mã, nó theo nghĩa đen chỉ là tiền tố '/ user/{username}' và sau đó sử dụng phương thức' SimpMessageTemplate.convertAndSend'. Nó không thực sự giải quyết vấn đề an ninh. – Nitroware

+0

Có, nó có: đó là một hàng đợi đặc biệt trong đó một sessionId duy nhất của người dùng được nối vào đích và được người môi giới loại bỏ một cách rõ ràng. Thử và xác minh rằng chỉ người dùng có thể nhận được thư được gửi ở đó: tất cả khách hàng thì không. –

+0

Xem thêm chi tiết và mã trong ví dụ của tôi tại đây: Có thể tôi thiếu một số thứ http://stackoverflow.com/questions/25004081/springmvc-websockets-messaging-user-authentication-with-spring-security | Nếu bạn đúng, tôi sẽ chỉ nuke câu hỏi của tôi như là một bản sao. – Nitroware

1

Bạn có thể thực hiện hai tùy chọn.

  1. Chỉ cần xóa "/ người dùng /" khỏi config.enableStompBrokerRelay. Tin nhắn mùa xuân sẽ tự động chuyển tiền tố.

    convertAndSendToUser không dành cho rơle môi giới.

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



Mặc định dùng tiền tố là '/ user /'. Bạn có thể thay đổi nó với config.setUserDestinationPrefix()





2. Ghi đè hai phương pháp và xử lý nó từ ChannelInterceptor

Phương pháp:

  • configureClientInboundChannel
  • configureClientOutboundChannel
  • Các vấn đề liên quan