使用 Spring @SubscribeMapping 获取当前用户
Get current user with Spring @SubscribeMapping
我在严重依赖 WebSockets 进行数据交换的 Spring 引导应用程序中使用 @SubscribeMapping。该应用程序受到 Spring 安全保护。
我在 WebSocket 上使用 Stomp 的客户端:
this.socket = new WebSocket(this.socketUrl);
this.stompClient = Stomp.over(this.socket);
this.stompClient.debug = null;
this.stompClient.connect({},
function(frame) {
this.$.chartLoader.generateRequest();
}.bind(this),
function(e) {
window.setTimeout(function() {
this.connectWs();
}.bind(this), 2500);
}.bind(this)
);
this.stompClient.subscribe('/topic/chart/' + chart.id,
function(message, headers) {
this.setChartData(chart, JSON.parse(message.body));
}.bind(this), {
"id" : "" + chart.id
}
);
服务器端,如何在注释方法中获取当前登录的用户?
@SubscribeMapping("/chart/{id}")
public void subscribeMapping(@DestinationVariable("id") final short id) {
// Here I would need the current user...
messagingTemplate.convertAndSend("/topic/chart/" + id, chartService.getChartData(account, sensor, new Date(), new Date()));
}
我试过了SecurityContextHolder.getContext().getAuthentication()
,但是returnsnull
。
您可以尝试添加一个 Principal
object as a method parameter. This interface is extended by Authentication
,它有多个可用的实现(Spring 将根据您的配置注入好的实现)。
public void subscribeMapping(@DestinationVariable("id") final short id, Principal principal) {
principal.getName();
}
This article也可能对你有帮助。
我在严重依赖 WebSockets 进行数据交换的 Spring 引导应用程序中使用 @SubscribeMapping。该应用程序受到 Spring 安全保护。
我在 WebSocket 上使用 Stomp 的客户端:
this.socket = new WebSocket(this.socketUrl);
this.stompClient = Stomp.over(this.socket);
this.stompClient.debug = null;
this.stompClient.connect({},
function(frame) {
this.$.chartLoader.generateRequest();
}.bind(this),
function(e) {
window.setTimeout(function() {
this.connectWs();
}.bind(this), 2500);
}.bind(this)
);
this.stompClient.subscribe('/topic/chart/' + chart.id,
function(message, headers) {
this.setChartData(chart, JSON.parse(message.body));
}.bind(this), {
"id" : "" + chart.id
}
);
服务器端,如何在注释方法中获取当前登录的用户?
@SubscribeMapping("/chart/{id}")
public void subscribeMapping(@DestinationVariable("id") final short id) {
// Here I would need the current user...
messagingTemplate.convertAndSend("/topic/chart/" + id, chartService.getChartData(account, sensor, new Date(), new Date()));
}
我试过了SecurityContextHolder.getContext().getAuthentication()
,但是returnsnull
。
您可以尝试添加一个 Principal
object as a method parameter. This interface is extended by Authentication
,它有多个可用的实现(Spring 将根据您的配置注入好的实现)。
public void subscribeMapping(@DestinationVariable("id") final short id, Principal principal) {
principal.getName();
}
This article也可能对你有帮助。