2014-05-21 16 views
6

Stworzyłem prostą aplikację, która wykorzystuje mechanizm websockets na wiosnę 4. Używam w mojej aplikacji brokera activemq.Wiosenny websocket z zabezpieczeniami stomp - każdy użytkownik może zasubskrybować kolejkę innych użytkowników?

W moim prosty test i utworzyć 10 wiadomości do użytkownika o nazwie "Alejandro" (user/Alejandro/kolejka/pozdrowienia)

Kiedy loguję się z "Alejandro" i zapisać się do tej kolejki:

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

Rzeczywiście otrzymuję wszystkie 10 wiadomości, które zostały pozyskane dla alejandro.

Problem polega na tym, że loguję się z innym użytkownikiem o nazwie "evilBart" i subskrybuję kolejkę alejandro, a także otrzymuję wiadomości?

Jak mogę wymusić na tym bezpieczeństwo? Chciałbym, aby użytkownik mógł zasubskrybować tylko własną kolejkę.

Dzięki!

moja klasa config:

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

} 

Odpowiedz

1

Sprawdź to similar question: trzeba uwierzytelnić użytkownika za pośrednictwem protokołu HTTP przy użyciu Wiosna Zabezpieczenia, a następnie wysłać wiadomość do użytkowników z wykorzystaniem metody SimpMessageTemplate.convertAndSendToUser().

+1

Ale to nie robi Naprawdę pomagam. Kiedy używasz 'SimpMessageTemplate.convertAndSendToUser', jeśli spojrzysz na kod, dosłownie po prostu przedrostuje"/user/{username} ", a następnie używa metody' SimpMessageTemplate.convertAndSend'. W rzeczywistości nie rozwiązuje problemu bezpieczeństwa. – Nitroware

+0

Tak, robi to: jest to specjalna kolejka, w której unikalny identyfikator sesji użytkownika jest dołączany do miejsca docelowego i jest przezroczyście usuwany przez broker. Spróbuj go i sprawdź, czy tylko pochodzący użytkownik może odbierać wiadomości wysłane: wszystkie inne klienci nie są. –

+0

Sprawdź więcej szczegółów i kodu w moim przykładzie tutaj: Może brakuje mi czegoś http://stackoverflow.com/questions/25004081/springmvc-websockets-messaging-user-authentication-with-spring-security | Jeśli masz rację, po prostu odpalę moje pytanie jako duplikat. – Nitroware

1

Możesz wybrać dwie opcje.

  1. Po prostu usuń "/ user /" z pliku config.enableStompBrokerRelay. Wiadomość wiosenna będzie automatycznie prefiksowana.
    convertAndSendToUser nie jest dla przekaźnika pośrednika.

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



użytkownik domyślny prefiks to '/ user /'. Można go zmienić z config.setUserDestinationPrefix()





2. Zastąpienie dwóch metod i obsługiwać go z ChannelInterceptor

Metody:

  • configureClientInboundChannel
  • configureClientOutboundChannel
  • Powiązane problemy