8

ellou 'Play'in 2.0 WebSocket'ında nasıl kullanıcı kimliğini doğrulayabilirim?

Beklendiği gibi çalışmakta olan yaygın Play WebSocket yöntemim var, ancak kullanıcının kimliğini doğrulamam gerekiyor. yönteminde kullanıcıyı tanımlamak için bile en basit yolu çalışırken maalesef:

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

bir hata alıyorum:

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

Benim şu anki geçici çözüm görüntülemek için rastgele, benzersiz bir tanımlayıcı geçmektir ve Kullanıcı modelinde kaydederek Bence sokete görüş açılışı yapabildiğim ve kullanıcı tarafından verilen tanımlayıcıyı bulabildiğimden, ancak kullanıcı başına sadece bir WebSocket bağlantısı olabileceğinden ve aynı zamanda sahteciliği önlemediği için bu mükemmel değildir.

Kullanıcı kimliğini nasıl doğrulamalıyım ve parodi saldırıyı nasıl önleyebilirim?

cevap

0

duyarlıdır ve bu durumda güvenlik performansı daha benim için daha önemli olduğunu, nihayet benim kullandığım iki adımlı mesajlar, önce mesajın WebSocket kimliği ile gönderilmesi ve bazı önemli olmayan verilerin gönderilmesi ve ardından AJAX ile getirilmesi ve kullanıcının kimlik doğrulamasından sonra güvenli eylem mesajı gövdesi.

Soru açılmış kalır: Tabii Ben bunun yerine HTTP Oturum gelen kimliği doğrulanmış kullanıcı kimliğini alırken denediniz Oyumu :)

1

Kod parçanızın nereden geldiğini bilmiyorum, ancak Websocket'in ilk bağlantısında (ilk bağlantı) HTTP isteğine erişebilmeniz gerekir; yani, yalnızca siz başlattığınızda kimlik doğrulaması olup olmadığını kontrol edebilmeniz gerekir. websocket soket bağlantısı (sonraki çağrı HTTP kullanılarak yapılmaz, Webscokets nasıl çalışır?).

Yani örneğin, controller içerisinde, böyle bir şey olabilir: Ben göndermek istediğiniz veri olarak

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

Örneğimi, kodunuza uyacak şekilde düzenledim, gördüğünüz gibi 'onReady (...)' içine yerleştirdim, 'return''den önce yerleştirildiğinde, null döndürür, özel durumu döndürür. Tabii ki her iki satır ('request(). Username()' ve benim 'Http.Context.current() ...') ortak eylemde geçerli kullanıcı adı döndürür. – biesior

+0

Ortak eylemlerinizde herhangi bir ek açıklama yok mu? Kullanıcı adını nasıl ayarlıyorsunuz? –

+0

Her iki eylem de aynı denetleyicide, Secured.class için not eki denetleyiciye eklenir, eylemde bulunmaz, böylece her ikisi de aynı şekilde kullanılmalıdır. Sorun şu ki ortak hareket Http.Context ve WebSocket almıyor. – biesior

1

değişecek diğer önerileri olacak mı? Bu noktada bağlam mevcut gibi görünüyor.

İlgili konular