SpringMVC WebSockets Messaging-Benutzerauthentifizierung mit Spring Security

8

Ich habe ein paar Threads zu diesem Thema gesehen, aber keiner von ihnen scheint die Frage direkt zu beantworten.

Hintergrund, ich habe Federsicherheit installiert, funktioniert und läuft reibungslos in anderen Teilen der Anwendung. Mein Benutzername ist "Entwickler".

Wird auf Java 7, Glassfish 4, Spring 4 und mit Angular + StompJS ausgeführt

Lass uns hier einen Code bekommen:

%Vor%

Ok, jetzt hier ist ein Controller, um alle 3 Sekunden Zeug zu senden:

%Vor%

Und schließlich das JavaScript mit SockJS

%Vor%

Und schließlich, für Tritte, die pom.xml

%Vor%

Hier ist was funktioniert:

  1. Ich kann wunderbar Kommunikation zwischen dem Client und dem Server
  2. herstellen
  3. Es ist schnell
  4. messagingTemplate.convertAndSend und messagingTemplate.convertAndSendToUser

Dies ist das Problem (oben erwähnt): Jeder kann andere Benutzer-Feeds abonnieren.

Nun, es gibt ein paar andere Versionen davon herum, ich werde sie unten auflisten und erklären, warum die Antworten falsch sind:

Was sind die Sicherheitsprobleme bei einem offenen Websocket? Verbindung?

Spring Websocket mit Stomp-Sicherheit - jeder Benutzer kann jede andere Benutzer-Warteschlange abonnieren

Websocket: Wie man drückt Eine Nachricht an einen Zielbenutzer

Hier ist das Problem:

  • Schauen Sie sich messagingTemplate.convertAndSendToUser an - Sie fügen lediglich das "Benutzerpräfix" und dann den angegebenen Benutzernamen hinzu und verwenden dann messagingTemplate.convertAndSend , was keine Sicherheit darstellt.

  • Dann sagen die Leute, dass "Sie Federsicherheit wie überall verwenden müssen" - das Problem hier ist A), dass ich Daten asynchron an den Client sende, also B) Ich werde diesen Code vollständig außerhalb verwenden der Sitzung des Benutzers, möglicherweise von einem anderen Benutzer (sagen wir, um eine Benachrichtigung an einen anderen angemeldeten Benutzer zu senden).

Lass es mich wissen, wenn das zu eng mit einem anderen Beitrag zusammenhängt, aber das ist ein großes Problem für mich und ich wollte dem gerecht werden.

Ich kann jedoch mehr Details bekommen, wenn jemand mehr Details benötigt.

    
Nitroware 28.07.2014, 20:47
quelle

3 Antworten

8

New Spring Security 4x unterstützt nun den Web-Socket vollständig. Sie können den Link verwenden Vorschau der Spring Security WebSocket-Unterstützung

Oder SpringSecuritySupportWebSocket.html , falls Sie ein vollständiges Beispiel benötigen,

    
phuong 09.01.2015, 03:29
quelle
6

Ich denke, Sie müssen diese Änderungen vornehmen:

1) Sie dürfenSimpleBroker nicht für "/ user" aktivieren, da es sich um eine spezielle vom Broker automatisch bearbeitete Warteschlange handelt.

2) Wenn der Server beispielsweise die Annotation "@SendToUser (" / queue / private ") verwendet, muss der Client die Warteschlange" / user / queue / private "abonnieren: Sie dürfen den Benutzernamen in der Warteschlange nicht vorgeben weil es eine transparente Operation ist, die vom Broker behandelt wird.

Ich bin sicher, das funktioniert richtig, weil ich es in meinem Setup verwende.

Ich habe nicht mit der convertAndSendToUser () Methode versucht, aber da seine Semantik dieselbe wie die Annotation sein sollte, sollte es auch funktionieren.

    
Alessandro Polverini 29.07.2014 17:22
quelle
2

Sie können die configureInbound-Methode in einer JavaConfig-Klasse überschreiben, indem Sie AbstractSecurityWebSocketMessageBrokerConfigurer erweitern.

%Vor%

Dort können Sie Anmeldeinformationen zum Abonnieren eines Kanals, zum Senden von Nachrichten oder zu mehreren anderen Dingen konfigurieren, wie in der Spring WebSocket-Dokumentation Ссылка

    
Jhovanni 26.06.2017 18:25
quelle