zoukankan      html  css  js  c++  java
  • rabbitmq websocket stomp 错误payload=Access refused for user 'guest'

    https://stackoverflow.com/questions/45281024/non-loopback-access-denied-error-while-configuring-spring-websocket-with-rabbitm

    content-length=[26]} session=_system_ text/plain payload=non-loopback access denied
    

     第一:

     

    配置rabbitmq的配置文件: cat /etc/rabbitmq/conf.d/10-default-guest-user.conf 

    追加:

    loopback_users = none

    另外追加用户,以及设定权限:

    rabbitmqctl set_permissions dunkbird ".*" ".*" ".*"

    rabbitmqctl add_user dunkbird 123456

    rabbitmqctl set_user_tags dunkbird administrator

    设定了tag可以进行登陆页面管理。

     

    websocke 配置

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    
        @Value("${application.stomp-broker-relay.host:localhost}")
        private String stompBrokerRelayHost;
    
        @Value("${application.stomp-broker-relay.port:61613}")
        private Integer stompBrokerRelayPort;
    
        @Value("${application.stomp-broker-relay.login}")
        private String stompBrokerRelayLogin;
    
        @Value("${application.stomp-broker-relay.passcode}")
        private String stompBrokerRelayPasscode;
    
        /**
         * 注册 STOMP 协议端点。
         * STOMP:Simple/Streaming Text Orientated Messaging Protocol。
         */
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            // 客户端连接端点
            registry.addEndpoint("/stomp").withSockJS();
        }
    
        /**
         * 设置 Message Broker 配置对象。
         */
        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            registry
                // 设置应用于所有 @MessageMapping 的前缀
                .setApplicationDestinationPrefixes("/v1")
                // 分隔符设置为句点
                .setPathMatcher(new AntPathMatcher("."));
    
            // 启用基于内存的 Message Broker
            //registry.enableSimpleBroker("/topic");
    
            // 启用基于 RabbitMQ 的 Message Broker
            registry
                .enableStompBrokerRelay("/topic")
                .setRelayHost(stompBrokerRelayHost)
                .setRelayPort(stompBrokerRelayPort)
                .setClientLogin(stompBrokerRelayLogin)
                .setClientPasscode(stompBrokerRelayPasscode)
                .setSystemLogin(stompBrokerRelayLogin)
                .setSystemPasscode(stompBrokerRelayPasscode);
        }
    
        /* 调试代码
        @Override
        public void configureClientInboundChannel(ChannelRegistration registration) {
            registration.interceptors(new ChannelInterceptor() {
                @Override
                public Message<?> preSend(Message<?> message, MessageChannel channel) {
                    log("I", "S", "PRE", message, channel);
                    return message;
                }
                @Override
                public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
                    Object destination = message.getHeaders().get("simpDestination");
                    if (sent && !ObjectUtils.isEmpty(destination)) {
                        redisTemplate.convertAndSend((String) destination, new String((byte[]) message.getPayload()));
                    }
                    log("I", "S", "PST", message, channel);
                }
                @Override
                public boolean preReceive(MessageChannel channel) {
                    log("I", "R", "PRE", null, channel);
                    return true;
                }
                @Override
                public Message<?> postReceive(Message<?> message, MessageChannel channel) {
                    log("I", "R", "PST", message, channel);
                    return message;
                }
            });
        }
    
        @Override
        public void configureClientOutboundChannel(ChannelRegistration registration) {
            registration.interceptors(new ChannelInterceptor() {
                @Override
                public Message<?> preSend(Message<?> message, MessageChannel channel) {
                    log("O", "S", "PRE", message, channel);
                    return message;
                }
                @Override
                public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
                    log("O", "S", "PST", message, channel);
                }
                @Override
                public boolean preReceive(MessageChannel channel) {
                    log("O", "R", "PRE", null, channel);
                    return true;
                }
                @Override
                public Message<?> postReceive(Message<?> message, MessageChannel channel) {
                    log("O", "R", "PST", message, channel);
                    return message;
                }
            });
        }
    
        private void log(String io, String when, String method, Message<?> message, MessageChannel channel) {
            System.out.printf(
                "[%s][%s][%s] TYPE: u001B[96m%su001B[0m; COMMAND: u001B[93m%su001B[0m; TOPIC: u001B[92m%su001B[0m; MESSAGE: u001B[94m%su001B[0m%n",
                io, when, method,
                message == null ? "<NULL>" : message.getHeaders().get("simpMessageType"),
                message == null ? "<NULL>" : message.getHeaders().get("stompCommand"),
                message == null ? "<NULL>" : message.getHeaders().get("simpDestination"),
                message == null ? "<NULL>" : new String((byte[]) message.getPayload())
            );
        }
        */
    }
    

      一定注意要设定下面的配置:

    .setSystemLogin(stompBrokerRelayLogin)
    .setSystemPasscode(stompBrokerRelayPasscode);

    否则会报下面的错误!

    Received ERROR {message=[Bad CONNECT], content-type=[text/plain], version=[1.0,1.1,1.2], content-length=[32]} session=_system_ text/plain payload=Access refused for user 'guest'

  • 相关阅读:
    优雅的windowsC++项目的配置
    C++实现编码转换
    C++读取配置文件
    完全依赖QML实现播放器
    记一次和“N+1”的擦肩而过
    FFmpeg4.0笔记:采集系统声音
    FFmpeg4.0笔记:采集桌面
    FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux
    SDL2:封装媒体显示播放Csdl2
    FFmpeg4.0笔记:封装ffmpeg的音频重采样功能类CSwr
  • 原文地址:https://www.cnblogs.com/dunkbird/p/15165501.html
Copyright © 2011-2022 走看看