Настройка процесса входа в систему FIX в акцепторе QuickFIX
Я использую QuickFIX и C# для создания акцептора исправления (сервера). Я хочу, чтобы клиент (инициатор исправления) вошел в систему, используя имя пользователя и пароль. Однако я не уверен, как я могу это сделать в QuickFIX.
отладив исходный код QuickFIX, я обнаружил следующую последовательность событий:
- QuickFIX позвонит
Session::verify
для проверки входа в систему. -
Session::verify
будет выполнять различные проверки таких вещей, как Comp ID и порядковые номера и на некоторые точки определяют, что полученный вход действителен. -
Session::verify
затем вызоветApplication::fromAdmin
обратный вызов, который я предполагаю, является естественным местом для настройки таких вещей, как вход в систему. - однако на данный момент вход в систему уже был определен как OK QuickFIX, и соответствующее сообщение о входе в систему будет возвращено акцептором при возврате обратного вызова.
как настроить процесс входа в систему FIX в акцепторе? Изменяет код QuickFIX мой единственный вариант?
3 ответов
Если вы используете FIX 4.3 или более поздней версии,вход в систему сообщение может иметь пароль тег. Если вы используете предыдущую версию, сделайте ее пользовательским тегом и добавьте в словари.
на fromAdmin
обработчик, проверьте правильность пароля (из таблицы поиска или в другом месте). Если это не так, бросьте RejectLogon
исключения. Если это исключение не вызвано, QuickFix предположит, что все в порядке, и зарегистрирует пользователя на.
пример (требуется больше проверки):
public void fromAdmin(Message message, SessionID id)
{
var logon = message as QuickFix44.Logon;
if (logon != null)
{
string userName = logon.getUserName().getValue();
string expectedPassword = PasswordsByUser[userName];
string suppliedPassword = logon.getPassword().getValue();
if(expectedPassword != suppliedPassword)
throw new RejectLogon();
}
}
fromAdmin уведомляет вас, когда административное сообщение отправляется от контрагента в механизм исправления. Это может быть полезно для дополнительной проверки сообщений входа в систему, таких как проверка паролей. Исключение RejectLogon приведет к отключению контрагента.
проверка сеанса обычно ckecks для строки начала исправления, SenderCompID и целевого CompID. Если это 3 в порядке, то сеанс настроен(QuickFIXJ имеет другие поля также для подкомпа идентификационная карточка.)
даже после того, как сеанс был настроен, сообщения не будут приняты в акцепторе для этого конкретного сеанса, пока процесс входа в систему не будет завершен. Вы получите отказ, если попытаетесь.
таким образом, в fromAdmin вы можете проверить запрос входящего сообщения входа в систему и проверить действительный пароль, содержащийся в сообщении входа в систему, вы ожидаете для этого соединения/сеанса.
бросание RejectLogon QuickFIXException нарушает весь код и прерывает остальные сеансы (если у вас есть более одного). В моем случае я составляю сообщение о выходе из системы и отправляю его обратно контрагенту. Код будет примерно таким:
public void fromAdmin(Message message, SessionID id)
{
var logon = message as QuickFix44.Logon;
if (logon != null)
{
string userName = logon.getUserName().getValue();
string expectedPassword = PasswordsByUser[userName];
string suppliedPassword = logon.getPassword().getValue();
if(expectedPassword != suppliedPassword)
{
Message _logoutmess = new Message();
_logoutmess.Header.SetField(new MsgType() { Tag = 35, Obj = "5" });
_logoutmess.SetField(new Text("Invalid credentials"));
Session.SendToTarget(_logoutmess, id);
}
}
}