如何使用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
相关产品推荐
相关产品推荐

