如何在一个springboot WebSocket请求中提供身份验证信息?

yhived7q  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(234)

在控制器中处理WebSocket请求时

SecurityContextHolder.getContext().getAuthentication()

返回null。但是我需要知道是哪个用户发出请求。
到目前为止尝试的内容:

  • Google向我推荐了实现ChannelInterceptor的解决方案,但在它的所有方法中,**getAuthentication()**也返回null。因此,没有什么东西可以继续使用。How to retrieve the current logged in user in a websocket controller
  • 在WebSocket控制器上实现**onApplicationEvent(会话订阅事件)onApplicationEvent(会话连接事件)**时,getAuthentication()返回空值。
  • 我发现在HandshakeInterceptor的一个实现中,**getAuthentication()*返回了一个Principal。在STOMP WebSocket控制器方法中可以获得什么信息?这些方法不能访问线程绑定请求。( 没有发现线程绑定请求 * 异常)当使用:
  • 当前请求属性().getSessionId()*

并且可以注入的sessionId(8个字符)与正常请求的会话ID(32个字符)不匹配:How to get Session Id in Spring WebSocketStompClient?

  • @信头(“simpSessionId”)字串工作阶段识别码 *
46qrfjad

46qrfjad1#

控制器可以侦听包含8个字符会话ID的会话连接事件和会话断开事件:

@EventListener
    public void handleWebSocketConnectListener(SessionConnectEvent event) {
        String sessionId = event.getMessage().getHeaders().get("simpSessionId", String.class);
        Principal principal = event.getUser();
        if (LOG.isInfoEnabled()) LOG.info("Session connect " + sessionId + ": " + principal);
        sessions.put(sessionId, principal);
    }

    @EventListener
    public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
        String sessionId = event.getSessionId();
        if (LOG.isInfoEnabled()) LOG.info("Session disconnect " + sessionId);
        sessions.remove(sessionId);
    }

并且消息处理方法可以获得注入的8个字符的sessionId:

@MessageMapping("/...")
    public void browserToBackend(Message message, @Header("simpSessionId") String sessionId) throws Exception {
        command.principal = sessions.get(sessionId);
        ...

相关问题