8

ellou 'Wie kann ich Benutzer in Play 2.0 WebSocket authentifizieren?

Ich habe gemeinsame Play WebSocket-Methode, die wie erwartet funktioniert, aber ich muss Benutzer authentifizieren. Leider, wenn auch einfachste Art und Weise versuchen, Benutzer in dem Verfahren zu identifizieren:

public class Application extends Controller { 
    public static WebSocket<JsonNode> connect() { 
     return new WebSocket<JsonNode>() { 

      @Override 
      public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) { 
       User logged = User.findByUsername(Http.Context.current().request().username()); 
       // ... 
      } 
     }; 
    } 
} 

ich einen Fehler:

java.lang.RuntimeException: There is no HTTP Context available from here. 

Meine aktuelle Problemumgehung ist zufällig, eindeutige Kennung es in User-Modell anzuzeigen passiert und Speicher , als ich aus der Sicht mit dem Socket verbinden und Benutzer mit der angegebenen Kennung finden kann, aber das ist nicht perfekt, da es nur eine WebSocket-Verbindung pro Benutzer geben kann und die Spoof auch nicht verhindert.

Wie soll ich den Benutzer authentifizieren und einen Spoof-Angriff verhindern?

Antwort

0

Als Daten-I empfindlich senden möchten und in diesem Fall die Sicherheit ist mir wichtiger als die Leistung, schließlich habe ich zweistufige Nachrichten, die zuerst über die WebSocket-ID der Nachricht und einige nicht wichtige Daten senden und dann nach der Authentifizierung des Benutzers über den AJAX- und den gesicherten Aktionsnachrichtentext abrufen.

Frage bleibt geöffnet: Natürlich, wenn es andere Vorschläge sein werde ich meine Stimme :)

1

Ich weiß nicht, wo kommt Ihr Stück Code, aber Sie sollten auf die HTTP-Anfrage auf die Initialisierung des Websocket (erste Verbindung) zugreifen können, dh Sie sollten in der Lage sein, die Authentifizierung nur zu überprüfen, wenn Sie initiieren Die Websocket-Socket-Verbindung (der nachfolgende Aufruf verwendet kein HTTP, so funktioniert Webscokets).

So zum Beispiel in Ihrem Controller, Sie so etwas wie dieses haben könnte:

public class Application extends Controller { 

    public static WebSocket<JsonNode> connect() { 

     Logger.info("Username from request = " + request().username()); 

     return new WebSocket<JsonNode>() { 

      @Override 
      public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) { 
       // .... 

      } 

     }; 
    } 

} 
+0

Ich habe mein Beispiel bearbeitet, um Ihren Code anzupassen, wie Sie sehen können, habe ich es in 'onReady (...)' platziert, es gibt die Ausnahme zurück, wenn es vor 'return' gestellt wird, gibt es null zurück. Natürlich geben beide Zeilen (Ihre 'request(). Username()' und meine 'Http.Context.current() ...') einen gültigen Benutzernamen in der gemeinsamen Aktion zurück. – biesior

+0

Haben Sie keine Anmerkungen zu häufigen Aktionen? Wie stellst du den Benutzernamen ein? –

+0

Beide Aktionen sind in der gleichen Controller, Annotation für die Secured.class ist in der Steuerung enthalten, nicht zur Aktion, also sollten beide sie auf die gleiche Weise verwenden. Ich denke, das Problem ist, dass gemeinsame Aktion Http.Context und WebSocket ist nicht. – biesior

1
ändern

Haben Sie den authentifizierten Benutzer-ID aus der HTTP-Session statt versucht, Abrufen? Der Kontext scheint zu diesem Zeitpunkt verfügbar zu sein.