使用spring@subscribemapping获取当前用户

ogq8wdun  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(369)

我在spring引导应用程序中使用@subscribemapping,它严重依赖websockets进行数据交换。应用程序使用spring security进行保护。
客户端我使用stomp over websocket:

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() ,但它回来了 null .

xt0899hw

xt0899hw1#

您可以尝试添加 Principal 对象作为方法参数。此接口由扩展 Authentication 它有几个可用的实现(spring将根据您的配置注入好的实现)。

public void subscribeMapping(@DestinationVariable("id") final short id, Principal principal) {
   principal.getName();    
}

这篇文章也可能对你有所帮助。

相关问题