ActiveMQ STOMP через Websockets Имя удаленного хоста - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь подключиться к экземпляру ActiveMQ из node.js, используя STOMP. js, который подключается через STOMP через веб-сокеты. У моего брокера есть политика безопасности, обеспечиваемая BrokerFilter:

package com.mycompany.queues.security;

import com.mycompany.domain.businessObjects.User;
import com.mycompany.domain.services.UserService;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.activemq.broker.Broker;
import org.apache.activemq.broker.BrokerFilter;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.broker.region.Subscription;
import org.apache.activemq.command.ConnectionInfo;
import org.apache.activemq.command.ConsumerInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BrokerAuthentication extends BrokerFilter {

    private static final Logger log = LoggerFactory.getLogger(BrokerAuthentication.class);
    private UserService userService;
    private List<String> noAuthIPs;
    private static final Pattern IP_PATTERN = Pattern.compile(".*://([0-9A-Za-z\\.]*).*");
    private static final Pattern CUSTOMER_ID_PATTERN = Pattern.compile(".*customer_id\\s*=\\s*(\\d+)\\s*.*");

    public BrokerAuthentication(Broker broker, UserService userService, List<String> noAuthIPs) {
        super(broker);
        this.userService = userService;
        this.noAuthIPs = noAuthIPs;
    }

    @Override
    public void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception {

        if (requiresAuth(context)) {
           //...
        }

        super.addConnection(context, info);
    }
    //...

    private boolean requiresAuth(ConnectionContext context) {

        String remoteAddress = context.getConnection().getRemoteAddress();
        Matcher matcher = IP_PATTERN.matcher(remoteAddress);

        if (matcher.matches()) {
            String ip = matcher.group(1);

            if (noAuthIPs.contains(ip)) {
                return false;
            }
        } else {
            log.info("IP not in no auth list " + remoteAddress);
        }
        return true;
    }
}

, где я пропустил некоторые несущественные вещи. NoAuthIPs устанавливается в файле конфигурации xml и должен включать localhost.

Когда я пытаюсь подключиться к брокеру с того же компьютера, эта ошибка регистрируется requiresAuth:

IP not in no auth list StompSocket_814158251

Копаясь в исходном коде activemq, кажется, что существует 29 различных реализаций интерфейса Connection, но мне не удается найти ту, которая могла бы дать мне StompSocket_814158251 в качестве удаленного адреса .

Я пробовал использовать grep для StompSocket в библиотеке узлов на GitHub и нарисовал пробел.

Я не могу просто добавить эту строку c к моей "разрешенной" hosts "из-за случайных чисел в конце, и, очевидно, небезопасно пытаться добавить какой-нибудь универсальный обходной путь, например сопоставление StompSocket с регулярным выражением, только потому, что я его не понимаю.

Откуда берется этот странный удаленный адрес и как я могу настроить свою аутентификацию для такого поведения?

Заранее спасибо за любую помощь.

EDIT: Моя версия ActiveMQ - 5.11 .1

Моя конфигурация подключения для узла Stomp. js клиент:

  const { AMQ_HOST, AMQ_PORT, AMQ_USERNAME, AMQ_PWD } = process.env;
  //...
  new Client({
    brokerURL: `ws://${AMQ_HOST}:${AMQ_PORT}/stomp`,
    connectHeaders: {
      login: AMQ_USERNAME,
      passcode: AMQ_PWD
    },
    debug: function (str) {
      logger.info(str);
    },
    reconnectDelay: 2,
    heartbeatIncoming: 4000,
    heartbeatOutgoing: 4000
  });

где в моем .env файле у меня

AMQ_HOST = localhost
AMQ_PORT = 61614
...