2010-08-27 7 views
6

Sto utilizzando QuickFIX e C# per creare un accettore (server) FIX. Voglio che il client (l'iniziatore FIX) acceda usando un nome utente e una password. Tuttavia, non sono sicuro di come farlo in QuickFIX.Personalizzazione del processo di accesso FIX in un accettore QuickFIX

Con il debug nel codice sorgente QuickFIX Ho scoperto la seguente sequenza di eventi:

  • QuickFIX chiamerà Session::verify per verificare l'accesso.
  • Session::verify eseguirà vari controlli di cose come i numeri di ID di comp e di sequenza e ad un certo punto determinerà che l'accesso ricevuto è valido.
  • Session::verify chiamerà quindi il callback Application::fromAdmin che presumo sia il posto naturale per personalizzare le cose come l'accesso.
  • Tuttavia, a questo punto l'accesso è già stato determinato per essere OK da QuickFIX e un messaggio di accesso corrispondente verrà restituito dal acceptor quando viene restituito il callback.

Come si personalizza il processo di accesso FIX in un accettore? La modifica del codice QuickFIX è la mia unica opzione?

risposta

5

Se si utilizza FIX 4.3 o successivo, il messaggio Logon può avere un tag Password. Se stai usando una versione precedente, falla diventare un tag personalizzato e aggiungila ai dizionari.

Nel gestore fromAdmin, verificare che la password sia corretta (da una tabella di ricerca o altrove). In caso contrario, genera un'eccezione RejectLogon. Se questa eccezione non viene generata, QuickFix presuppone che tutto sia a-ok e l'utente acceda.

Esempio (ha bisogno di più controlli di integrità):

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

Lanciare un'eccezione 'RejectLogon' in' fromAdmin' quando si riceve un messaggio di accesso senza nome utente e password appropriati era il pezzo mancante. –

1

fromAdmin notifica quando un messaggio amministrativo viene inviato da una controparte al motore FIX. Questo può essere utile per fare una validazione extra sui messaggi di accesso come per controllare le password. Lanciare un'eccezione RejectLogon disconnetterà la controparte.

La verifica di sessione generalmente verifica per la stringa FIX Begin, SenderCompID e target CompID. Se questo 3 va bene allora viene impostata la sessione (QuickFIXJ ha altri campi anche per i subcompassi).

Anche dopo l'impostazione di Sessione, i messaggi non vengono accettati all'accettatore, per quella specifica sessione, fino al completamento della procedura di accesso. Otterrai uno scarto se lo provi.

Quindi in fromAdmin è possibile verificare la richiesta di messaggio di accesso in entrata e verificare la password valida, contenuta nel messaggio di accesso, previsto per tale connessione/sessione.

1

Lanciare un RejectLogon QuickFIXException rompe tutto il codice e interrompe il resto delle sessioni (se avete più di uno). Nel mio caso, compongo un messaggio di logout e lo rimando alla controparte. Il codice sarebbe simile al seguente:

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); 
      } 
    }  
} 
Problemi correlati