8

你好

我有按预期工作的通用 Play WebSocket 方法,但我需要对用户进行身份验证。不幸的是,当尝试使用最简单的方法来识别该方法中的用户时:

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

我收到一个错误:

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

我目前的解决方法是传递随机的唯一标识符来查看并将其保存在用户模型中,然后我可以从视图连接到套接字并找到具有给定标识符的用户,但这并不完美,因为只能有一个 WebSocket 连接每个用户,也不能防止恶搞。

我应该如何对用户进行身份验证并防止欺骗攻击?

4

3 回答 3

1

我不知道您的代码从哪里来,但是您应该能够在 Websocket 初始化(第一个连接)时访问 HTTP 请求,即您应该只有在启动 websocket 套接字连接时才能检查身份验证(后续调用将不会使用 HTTP,这是 Webscokets 的工作方式)。

例如,在你的控制器中,你可以有这样的东西:

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) {
                // ....

            }

        };
    }

}
于 2012-05-07T20:32:53.193 回答
1

您是否尝试过从 HTTP 会话中检索经过身份验证的用户 ID?在这一点上,上下文似乎是可用的。

于 2012-07-03T01:06:42.837 回答
0

由于我要发送的数据很敏感,在这种情况下,安全性对我来说比性能更重要,最后我使用了两步消息,首先通过消息的 WebSocket id 和一些不重要的数据发送,然后通过 AJAX 和安全操作获取用户认证后的消息正文。

问题仍未解决:当然,如果有其他建议,我会改变我的投票:)

于 2012-05-08T11:47:24.630 回答