Spring Stomp SimpUserRegistry 匿名用户
Posted
技术标签:
【中文标题】Spring Stomp SimpUserRegistry 匿名用户【英文标题】:Spring Stomp SimpUserRegistry Anonymous Users 【发布时间】:2019-03-04 12:41:05 【问题描述】:SimpUserRegistry
让您检索所有经过身份验证的 Stomp 会话的详细信息,是否有任何此类可以让我遍历匿名用户会话?
【问题讨论】:
您的应用程序如何拥有未经身份验证的会话?你的意思是匿名用户? 是的,我的意思是,对不起 您能指定您使用的是哪个 spring-framework/spring boot 版本吗? @FlorianDe 2.1.3.RELEASE 弹簧靴 【参考方案1】:就像他的回答中描述的howie,只有非匿名用户才会被添加到SimpUserRegistry
。
但如果你真的想添加匿名用户,你只需要继承 DefaultHandshakeHandler 类并重写如Spring Doc for Version 5.0.0.M1 - Chapter 22 中所述的determineUser 方法。这也应该适用于您在使用 Spring Boot 2.1.3.RELEASE 时当前使用的 5.1.5.Release:
在某些情况下,即使用户尚未经过正式身份验证,为 WebSocket 会话分配身份也可能很有用。例如,移动应用程序可能会根据地理位置为匿名用户分配一些身份。目前,应用程序可以继承 DefaultHandshakeHandler 并覆盖 determineUser 方法。然后可以插入自定义握手处理程序(请参阅第 22.2.4 节“部署注意事项”中的示例)。
这是一个答案 (Spring websockets without principal),它向您展示了如何创建 AnonymousPrincipal 并在自定义握手处理程序中确定它。
最后,您必须将自定义握手处理程序的实例添加到您注册的端点,但这取决于您是否使用 STOMP。
【讨论】:
【参考方案2】:以下是 StompSubProtocolHandler 的一些代码 sn-ps - handleMessageFromClient 方法将用户添加到 stompAuthentications 映射并发布 SessionConnectEvent 事件 -
public void handleMessageFromClient(WebSocketSession session, WebSocketMessage<?> webSocketMessage, MessageChannel outputChannel)
//...
SimpAttributesContextHolder.setAttributesFromMessage(message);
boolean sent = outputChannel.send(message);
if (sent)
if (isConnect)
Principal user = headerAccessor.getUser();
if (user != null && user != session.getPrincipal())
this.stompAuthentications.put(session.getId(), user);
else
//TODO try to handle here for anonymous user
if (this.eventPublisher != null)
if (isConnect)
publishEvent(new SessionConnectEvent(this, message, getUser(session)));
//...
我认为您必须检查此安全代码StompSubProtocolHandler,并对其进行自定义。
【讨论】:
以上是关于Spring Stomp SimpUserRegistry 匿名用户的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spring+stomp+sockjs 获得 websocket 响应
Spring 4 - websocket 消息传递 stomp 处理程序
Spring(Websockets / REST / Security)、JWT 和 Sockjs(Stomp)集成
Spring 4 Web 套接字 - 我必须有一个 stomp 代理吗?