ellou 'Come posso autenticare l'utente in WebSocket 2.0 di Play?
Ho un metodo Play WebSocket comune che funziona come previsto, ma devo autenticare l'utente. Purtroppo quando si cerca anche modo più semplice per identificare utenti nel metodo:
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());
// ...
}
};
}
}
ottengo un errore:
java.lang.RuntimeException: There is no HTTP Context available from here.
mia soluzione attuale è quella di passare a caso, identificatore univoco per visualizzare e salvarlo in modello User , che posso connettermi al socket dalla vista e trovare l'utente con l'identificatore dato, ma questo non è perfetto in quanto può esserci una sola connessione WebSocket per utente e inoltre non impedisce lo spoofing.
Come devo autenticare l'utente e prevenire attacchi di spoofing?
Ho modificato il mio esempio, per adattarlo al vostro codice, come potete vedere l'ho inserito in 'onReady (...)', restituisce l'eccezione, quando posizionato prima di 'return' restituisce null. Ovviamente entrambe le righe (il tuo 'request(). Username()' e il mio 'Http.Context.current() ...') restituiscono un nome utente valido nell'azione comune. – biesior
Non hai alcun tipo di annotazione sulle azioni comuni? Come stai impostando il nome utente? –
Entrambe le azioni si trovano nello stesso controller, l'annotazione per Secured.class è inclusa nel controller, non all'azione, quindi entrambi dovrebbero utilizzarle allo stesso modo. Penso che il problema è che l'azione comune ottiene Http.Context e WebSocket non lo è. – biesior