【发布时间】:2021-04-29 14:19:23
【问题描述】:
根据spring官方文档:
WebSockets 重用与在 建立 WebSocket 连接时的 HTTP 请求。这意味着 HttpServletRequest 上的 Principal 将被移交给 网络套接字。如果您使用的是 Spring Security,则 HttpServletRequest 被自动覆盖。
更具体地说,确保用户已通过您的 WebSocket 的身份验证 应用程序,只需要确保您设置了 Spring 对基于 HTTP 的 Web 应用程序进行身份验证的安全性。
如果我理解正确,这意味着 WebSocket 自握手以来使用相同的通道进行通信,因此应该在第一次连接时进行身份验证。
但是没有说明如何以标准的安全方式实际验证握手。据我所知,HTTP 在升级到 WebSocket 时不会发送 Authentication 标头,那么它是如何完成的?
我真的需要在连接查询中发送身份验证令牌吗,例如
localhost:8080/ws?Auth=...
并将安全性留给 HTTPS
或者我是否需要在建立连接后验证 WebSocket,例如创建我自己的握手?
有没有适当的正式方式来做到这一点?我正在使用 RAW websockets。
感谢您的想法/帮助。
【问题讨论】:
-
As far as I am aware HTTP doesn't send an Authentication header while upgrading to the WebSockets什么意思,升级?当您执行初始 HTTP 请求时,您会提供身份验证标头或会话 cookie,具体取决于您正在运行的安全类型。 -
但是,当您想要初始化 WebSockets 时,您会发送一个带有 Upgrade 标头的请求,然后开始与 WebSockets 握手。之后,您将无法更好地使用 Web 套接字的客户端实现,也不会让您发送身份验证标头。我可能对这里的细节有误。请随时纠正我!
-
RFC 指定了以下 tools.ietf.org/html/rfc6455#section-10.5 并且 opning 握手是一个普通的 GET 请求,没有什么花哨的,因此您可以在其中包含标头、cookie 或任何您需要的东西。 tools.ietf.org/html/rfc6455#section-1.3
-
嗯,很有趣,但是您仍然使用 WebSocket 的客户端库,并且它们都不允许您指定身份验证标头。例如,我为此使用本机 JS websocket()。
-
好吧,javascript 世界和后端世界之间似乎存在不匹配。 RFC说它是允许的,但没有你说的实现。我找到了这个stackoverflow.com/questions/4361173/…
标签: java spring spring-boot spring-security websocket