Я пытаюсь подключиться к экземпляру 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