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%s\u001B[0m; COMMAND: \u001B[93m%s\u001B[0m; TOPIC: \u001B[92m%s\u001B[0m; MESSAGE: \u001B[94m%s\u001B[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'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章