You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Spring Security用户名登录Spring开发的STOMP聊天应用

适配逻辑位置说明

你需要的适配逻辑分两类拆分处理:

  • Spring Security身份校验、STOMP连接权限控制、消息级安全拦截,放在STOMP侧的WebSocket安全配置层实现,不要写在业务Controller中
  • 消息参数解析、业务逻辑校验,放在@MessageMapping对应的Controller层处理

当前问题排查&修复方案

你现在无法识别输入、进不了聊天室的核心问题是前后端匹配规则不一致+Spring Security未适配WebSocket,修复点如下:

1. 修复前后端消息路径不匹配问题

后端@MessageMapping配置的映射路径是/chat.sendMessage、/chat.addUser,结合默认应用前缀/app,前端正确的调用路径应该是/app/chat.sendMessage、/app/chat.addUser,你当前前端写的/app/chat和后端映射完全不匹配,导致请求无法被Controller接收。

2. 统一前后端消息结构

后端ChatMessagePojo定义的字段是type、content、sender,但你前端传递的是senderId、recipientId、senderName等完全不对应的字段,会导致Spring反序列化失败,无法读取输入内容。你可以选择修改Pojo补充需要的字段,或者调整前端传参结构和Pojo字段保持一致。

3. 补充Spring Security对WebSocket的适配配置

Spring Security默认会拦截WebSocket连接请求,未配置放行规则的话STOMP连接会直接被拒绝,根本到不了业务逻辑层,需要新增如下配置:

WebSocket基础配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // 开启广播、点对点消息代理
        config.enableSimpleBroker("/topic", "/queue");
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 放行WebSocket连接端点,允许跨域
        registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();
    }
}

Security放行规则配置

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                // 放行WebSocket相关路径
                .requestMatchers("/ws/**", "/chat").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(Customizer.withDefaults());
        return http.build();
    }
}

4. 修复订阅路径匹配问题

你后端@SendTo是推送到/topic/public公共广播地址,但当前前端只订阅了/user/{id}/queue/messages单人接收地址,自然收不到进聊天室的广播通知,需要在前端onConnected方法中补充广播订阅:

stompClient.subscribe("/topic/public", onMessageReceived);

内容的提问来源于stack exchange,提问作者Lemair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:15:04