2010-08-27 2 views
6

Я использую QuickFIX и C# для создания акцептора FIX (сервера). Я хочу, чтобы клиент (инициатор FIX) входил в систему с использованием имени пользователя и пароля. Однако я не уверен, как это сделать в QuickFIX.Настройка процесса входа FIX в приемник QuickFIX

При отладке в исходный код QuickFix я обнаружил следующую последовательность событий:

  • QuickFix будет вызывать Session::verify для проверки входа в систему.
  • Session::verify будет выполнять различные проверки таких вещей, как идентификаторы comp и порядковые номера, и в какой-то момент определить, что полученный вход действителен.
  • Session::verify затем вызовет обратный вызов Application::fromAdmin, который, как я полагаю, является естественным местом для настройки таких вещей, как вход в систему.
  • Однако на этом этапе учетная запись уже была определена как операционная система QuickFIX, и соответствующее соответствующее сообщение будет возвращено акцептором при возврате обратного вызова.

Как настроить процесс входа в систему FIX в акцепторе? Меняет ли QuickFIX-код мой единственный вариант?

ответ

5

Если вы используете FIX 4.3 или новее, сообщение Logon может иметь тег Password. Если вы используете предыдущую версию, сделайте ее специальным тегом и добавьте в словари.

В обработчике 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(); 
    }  
} 
+1

Выдача исключения 'RejectLogon' в' fromAdmin' при получении сообщения о входе в систему без правильного имени пользователя и пароля была отсутствующей частью. –

1

fromAdmin уведомляет вас, когда административное сообщение отправляется от вашего контрагента к вашему движку FIX. Это может быть полезно для выполнения дополнительной проверки при входе в систему, например, для проверки паролей. Выброс исключения RejectLogon отключит контрагента.

Проверка сеанса в целом ckecks для FIX Begin String, SenderCompID и целевого CompID. Если это 3, то сеанс настроен (QuickFIXJ имеет другие поля также для подкомпьютов).

Даже после того, как сеанс был настроен, сообщения не принимались на акцепторе для этой конкретной сессии до завершения процесса входа в систему. Если вы попробуете, вы получите отказ.

Таким образом, в fromAdmin вы можете проверить входящий запрос на вход в систему и проверить действительный пароль, содержащийся в сообщении о входе в систему, которое вы ожидаете от этого соединения/сеанса.

1

бросание 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); 
      } 
    }  
}