我有一个基于JWT的应用程序,由Spring Security保护。一切都很安全,工作正常。此外,应用程序公开了一个websocket url(localhost:8080/ws),用户可以订阅(/realtime)并接收通用更新,即每个用户,经过身份验证或未经身份验证,都会收到更新。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/realtime");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.withSockJS();
}
}
客户代码:
//private _channel = "/realtime";
constructor(){
this.connect();
}
public connect() : void {
let self = this;
var token = localStorage.getItem("token");//get jwt from storage
self._webSocketUrl = "http://localhost:8080/ws";
//let webSocket = new WebSocket(this._webSocketUrl);//without sockjs
let webSocket = new SockJS(this._webSocketUrl);//with sockjs
self._stompClient = Stomp.over(webSocket);
self._stompClient.connect({}, function (frame) {
self._stompClient.subscribe("/realtime", function (stompResponse) {
console.log("got data from server");
self._stompSubject.next(stompResponse);
});
});
}
所有这些都可以正常工作。现在,每当服务器上发生他们感兴趣的事情时,我都需要向特定的认证用户发送通知。所以,我从来没有收到过用户的任何消息。每当认证用户需要发送请求时,他可以通过restendpoint而不是websocket来完成。所以,一旦他登录,连接到 /wsendpoint并订阅了"/实时目的地,他就完成了。现在,我的工作是在特定用户可用时向他们发送通知。这是一种通过websocket进行的单向(服务器到客户端)通信。这将在未来改变。
所以,每当我有一个认证用户的东西,比如,user123@gmail.com,我如何通过websocket向他发送通知?
我在stackoverflow上经历了许多链接和问题,但找不到任何有用的东西。
我能够通过执行以下操作来实现这一点:
>
例如,在订阅中使用身份验证主体
self._stompClient.subscribe("/realtime/" + userName, function (stompResponse) {
console.log("got data from server");
self._stompSubject.next(stompResponse);
});
});
发送给用户作为
simpMessagingTemplate.convertAndSendToUser(userName, "/realtime/", message);
请注意,此解决方案可能无法提供适当的安全控制。请查看https://docs.spring.io/spring-security/site/docs/current/reference/html/websocket.html