【问题标题】:How to reply to unauthenticated user in Spring 4 STOMP over WebSocket configuration?如何通过 WebSocket 配置回复 Spring 4 STOMP 中未经身份验证的用户?
【发布时间】:2014-02-14 05:45:40
【问题描述】:

我正在试验 Spring 4 WebSocket STOMP 应用程序。有没有办法在每个用户都有唯一的会话 ID 的情况下回复单个未经身份验证的用户?现在我只能广播消息或将其直接发送给经过身份验证的用户。

@Controller
public class ProductController {

    @MessageMapping("/products/{id}")
    @SendTo("/topic") // This line makes return value to be broadcasted to every connected user.
    public String getProduct(@DestinationVariable int id) {
        return "Product " + id;
    }
}

【问题讨论】:

标签: spring websocket stomp spring-messaging spring-websocket


【解决方案1】:

您可以为传入用户分配匿名身份。有两种方法可以做到这一点。

第一,您可以配置DefaultHandshakeHandler 的子类,它会覆盖determineUser 并为每个WebSocketSession 分配某种身份。顺便说一下,这需要 4.0.1(目前提供构建快照),将于 2014 年 1 月 23 日星期一发布。

第二,WebSocket 会话将依赖于在握手 HTTP 请求上从 HttpServletRequest.getUserPrincipal 返回的值。您可以让一个 servlet 过滤器包装 HttpServletRequest 并决定从该方法返回什么。或者,如果您使用的是具有 AnonymousAuthenticationFilter 的 Spring Security,请覆盖其 createAuthentication 方法。

【讨论】:

  • 感谢您的回复!只能明天试试。
  • 谢谢,第一个选项成功了。一个问题。当我执行@SendToUser("/prodcuts") 时,它总是将唯一的用户标识符附加到路径中:/user/products-user0/user/products-user1 等等。虽然我在为匿名用户创建 Principal 时使用 UUID 作为名称。有没有办法覆盖这种行为?允许网络服务器只增加这个 ID 真的安全吗?
【解决方案2】:

@SendToUser("/products") 应该会向目标“/user/{username}/products”发送一条消息。该消息将由UserDestinationMessageHandler 处理,它将目的地转换为“/products-user{sessionId}”并重新发送消息。

所以我不太确定“/user/products-user0”是什么。它在两个方面让我感到惊讶。首先,如果它以“/user”开头,那么这就是转换之前的目标,后面应该是用户名(即“/user/{username}/products”)。

它以“-user0”结尾的事实使它看起来像转换后的目标,但它不应该以“/user”开头。无论如何,这种情况下的 0、1 将是 WebSocket 会话 ID。这是什么服务器?

【讨论】:

  • 1.确认@SendToUser 将目标转换为/user/{username}/products,其中{username} 是我明确指定为每个匿名用户主体的名称的UUID。 2.确实,客户端destination标头中没有/user/前缀,对不起,我的错。 3.关于-user0后缀,我期待看到用户的UUID而不是0,但现在我看到它反映了WebSocket的会话,而不是用户ID。我使用 Spring Boot 1.0.0.RC1 默认嵌入的 Tomcat v7.0.47。这种行为是特定于服务器的吗?你不知道我是否可以覆盖这个会话 ID 行为?
  • 是的,它是特定于服务器的。您可以在 Tomcat 用户列表上询问有关如何自定义它的建议,或者是否可以。此外,当使用 SockJS(使用 WebSocket 传输)时,会话 ID 是 SockJS 会话 ID。
猜你喜欢
  • 2018-11-07
  • 2019-11-10
  • 1970-01-01
  • 2023-03-14
  • 2017-09-11
  • 2020-11-15
  • 2016-01-17
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多