如何使用 SockJs 通过 STOMP Java 客户端验证 Spring 非 Web Websocket?

Posted

技术标签:

【中文标题】如何使用 SockJs 通过 STOMP Java 客户端验证 Spring 非 Web Websocket?【英文标题】:How authenticate a Spring non-web Websocket over STOMP Java client using SockJs? 【发布时间】:2017-01-18 04:16:57 【问题描述】:

基于会话的身份验证?基于令牌的身份验证?

文档说:

现有的 Web 应用程序已经使用基于 HTTP 的身份验证。例如

Spring Security 可以像往常一样保护应用程序的 HTTP URL。 由于 WebSocket 会话以 HTTP 握手开始,这意味着 映射到 STOMP/WebSocket 的 URL 已经被自动保护并且 需要身份验证。此外,打开 WebSocket 的页面 连接本身可能受到保护,因此在实际发生时 握手,用户应该已经通过身份验证。

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#websocket-stomp-authentication

实际上,我在没有身份验证的情况下进行连接,并且正在发送消息。我的 Java 服务器应用程序使用 Spring 框架,但我的客户端是 Java 客户端,而不是 Web 客户端。

【问题讨论】:

【参考方案1】:

官方文档说:

String url = "ws://127.0.0.1:8080/endpoint";
StompSessionHandler sessionHandler = new MyStompSessionHandler();
stompClient.connect(url, sessionHandler);

但还有其他带有附加参数 WebSocketHttpHeaders 的连接方法。我将它用于基本授权:

WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
String auth = "user" + ":" + "password";
headers.add("Authorization", "Basic " + new String(Base64.getEncoder().encode(auth.getBytes())));
stompClient.connect(url, headers, new MyStompSessionHandler());

【讨论】:

以上是关于如何使用 SockJs 通过 STOMP Java 客户端验证 Spring 非 Web Websocket?的主要内容,如果未能解决你的问题,请参考以下文章

在进行跨域请求时,如何使用 SockJS 和 STOMP 添加 Spring Security JSESSIONID?

带有 Sockjs 和 Spring 4 但没有 Stomp 的 WebSocket

将 Spring websockets (sockJS + Stomp) 与基于令牌的身份验证 (JWT) 一起使用的最佳方法

如何在 Spring 5.3 及更高版本中使用 Stomp 和 SockJS 处理 CORS 起源?

Stomp SockJs 客户端 + 服务器 Spring

通过 spring websocket、sockJs 和 STOMP 向经过身份验证的用户发送通知