首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在springboot websocket请求中提供身份验证信息?

如何在springboot websocket请求中提供身份验证信息?
EN

Stack Overflow用户
提问于 2022-11-06 15:46:11
回答 1查看 20关注 0票数 0

在控制器中处理websocket请求时

代码语言:javascript
运行
复制
SecurityContextHolder.getContext().getAuthentication() 

返回null。但我需要知道是哪个用户提出了请求。

到目前为止所做的尝试:

谷歌( getAuthentication() )

在websocket控制器上实现onApplicationEvent(SessionSubscribeEvent)onApplicationEvent(SessionConnectEvent)

  • getAuthentication()返回null.

我发现,在getAuthentication()的一个实现中,

  • 返回一个
  • 。在STOMP控制器方法中可以提供哪些信息?这些方法没有访问线程绑定请求的权限。(没有线程绑定请求找到异常)时,使用:

RequestContextHolder.currentRequestAttributes().getSessionId()

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

@Header("simpSessionId")字符串sessionId

EN

回答 1

Stack Overflow用户

发布于 2022-11-06 19:35:52

控制器可以监听SessionConnectEvents和SessionDisconnectEvents,其中包含8个字符的sessionId:

代码语言:javascript
运行
复制
    @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:

代码语言:javascript
运行
复制
@MessageMapping("/...")
    public void browserToBackend(Message message, @Header("simpSessionId") String sessionId) throws Exception {
        command.principal = sessions.get(sessionId);
        ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74337376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档