问题描述
SimpUserRegistry
允许您检索所有经过身份验证的 Stomp 会话的详细信息,是否有任何此类可以让我遍历匿名用户会话?
1楼
就像在他的回答中描述的一样,只有非匿名用户才会被添加到SimpUserRegistry
。
但是,如果您真的想添加匿名用户,您只需要对 DefaultHandshakeHandler 类进行子类化,并像中所述那样覆盖确定用户方法。 这也应该适用于您当前使用 Spring Boot 2.1.3.RELEASE 时使用的 5.1.5.Release:
在某些情况下,即使用户尚未经过正式身份验证,为 WebSocket 会话分配身份也可能很有用。 例如,移动应用程序可能会根据地理位置为匿名用户分配一些身份。 当前,应用程序可以子类 DefaultHandshakeHandler 并覆盖确定用户方法。 然后可以插入自定义握手处理程序(参见第 22.2.4 节“部署注意事项”中的示例)。
这是一个答案( ),它向您展示了如何创建 AnonymousPrincipal 并在自定义握手处理程序中确定它。
最后,您必须将自定义握手处理程序的实例添加到您注册的端点,但这取决于您是否使用 STOMP。
2楼
以下是来自 StompSubProtocolHandler 的一些代码片段 - 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)));
}
//...
我认为您必须检查此源代码 ,并对其进行自定义。