SpringSecurity结合Stomp使用WebSocket

时间:2025-02-19 12:52:20
@Configuration @EnableWebSocketMessageBroker public class WebSocketBrokerConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { private static final String[] PERMISSIONS_LIST = { "ROOT", "USER"}; private static final String ENDPOINTS="/stomp/webSocket" @Resource(name = "webSocketInboundThreadPool") private ThreadPoolTaskExecutor webSocketInboundThreadPool; @Resource private TokenService tokenService; @Resource private RedisTemplate<String, Object> redisTemplate; /** * 创建WebSocket消息错误处理器 */ @Bean public StompSubProtocolErrorHandler stompSubProtocolErrorHandler() { return new WebSocketErrorHandler(); } /** * 创建消息入站拦截器 */ @Bean public ChannelInterceptor inboundInterceptor() { return new WebSocketInboundInterceptor(constant, tokenService, redisTemplate); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry //配置错误处理器 .setErrorHandler(stompSubProtocolErrorHandler()) //配置WebSocket对外连接站点 .addEndpoint(constant.getSocketEndpoints()) //允许跨域 .setAllowedOrigins("*") //使用SocketJS .withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { //配置客户端订阅地址前缀 registry.enableSimpleBroker(constant.getSocketClientSubscribePrefix(), constant.getSocketClientResponseSubscribePrefix(), constant.getSocketCommonSubPre()); //配置客户端发送消息前缀 registry.setApplicationDestinationPrefixes(constant.getSocketClientSendPrefix()); //配置客户端点对点发送消息前缀 registry.setUserDestinationPrefix(constant.getSocketClientUserPrefix()); } @Override protected void customizeClientInboundChannel(ChannelRegistration registration) { registration //配置消息入站拦截器 .interceptors(inboundInterceptor()) //配置入站通道线程池 .taskExecutor(webSocketInboundThreadPool); } /** * 允许跨域访问 */ @Override protected boolean sameOriginDisabled() { return true; } @Override <