Dipendenze dal middleware

1

Sto provando a convertire un'app di PHP legacy per utilizzare il paradigma del middleware, simile a connect / express.js.

Ho iniziato a eseguire il porting del codice in un middleware separato in modo che ogni funzione sia ordinatamente autonoma e possa essere facilmente aggiunta / rimossa / ri-organizzata in base alle esigenze future.

Tuttavia, sto scoprendo che molti di questi middleware dipendono da altri middleware. Ad esempio, ho un middleware DebugBar che aggiunge una barra nella parte inferiore di ogni pagina se sei su dev (che è determinato tramite un middleware di ambiente), o se sei un superutente (determinato dal middleware auth).

Il nostro sito ha anche un menu di collegamento che cambia in base alle autorizzazioni dell'utente. Le tue autorizzazioni utente non possono essere determinate fino a quando non sei autenticato, e non voglio affatto autenticare a meno che tu non sia su una pagina che lo richiede (in pratica qualsiasi cosa eccetto la pagina di accesso / uscita e 1 o 2 altre pagine) - quindi c'è anche il middleware condizionale basato su quale pagina stai visualizzando.

Fino ad ora ho copiato più o meno come esprimere le cose , ma per quanto mi riguarda può dire, non hanno davvero esempi di middleware a seconda l'uno dell'altro, e se lo fanno, si dovrebbe semplicemente applicare la patch della scimmia all'oggetto di risposta e i middleware successivi potrebbero dipendere da esso o crash, il che non sembra un ottimo modo di fare le cose.

Domande:

  1. Qual è il modo migliore per condividere i dati tra i middleware? L'applicazione di patch di scimmia a un oggetto risposta sembra molto fragile.
  2. Come posso chiarire quale middleware dipende da cosa? Ci sono un certo numero di sviluppatori qui, non tutti possono sapere esattamente l'ordine che app.uses devono essere presenti in
posta mpen 28.05.2015 - 01:20
fonte

2 risposte

1

(Disclaimer: non conosco nessuna delle tecnologie menzionate nella domanda, sto solo considerando le descrizioni sulla domanda stessa e gli articoli collegati.)

Dipendenza e ordine di esecuzione. Basato sulla documentazione collegata ,

  • Sembra che tu possa controllare l'ordine di esecuzione dei middleware semplicemente chiamando app.use(...) in un ordine particolare.
  • Può essere documentato chiaramente all'interno del tuo progetto.
  • C'è un modo per farlo funzionare correttamente; se si può fare in modo manutentivo (non fragile) è una questione di
    • Il tuo design e
    • La tua (o programmatore) disciplina nel seguire le linee guida

Esistono modelli e tecniche di progettazione pertinenti che ti aiuteranno a mantenere la dipendenza e l'ordine di esecuzione corretti.

  • Modello di comando
  • Modello della catena di responsabilità
  • Motivo decoratore
  • Ordinamento topologico , che può essere utilizzato per calcolare l'ordine di esecuzione in base alle loro dipendenze. Probabilmente lo farai con carta e penna, dato che hai il controllo su quali middleware saranno eseguiti e non ci saranno nuovi middleware da aggiungere.

Riguardo a "monkey-patch (ing) l'oggetto risposta",

  1. Un middleware che viene eseguito in anticipo può inserire alcuni segnaposto nella risposta, che verrà sostituito dal contenuto reale da un altro middleware che verrà eseguito in seguito.
  2. Può esserci anche un middleware finale che rimuove qualsiasi segnaposto che non è stato elaborato (vale a dire come un catch-all in caso di errore di programmazione) e lo sostituisce con un messaggio di errore.
  3. Per prevenire attacchi di iniezione (l'utente manipola in qualche modo il contenuto inviato dall'utente per sembrare indistinguibile da un segnaposto), puoi disinfettare (rimuovere) tali segnaposti dalla risposta all'inizio, prima che vengano aggiunti eventuali segnaposti originali.
  4. Tutto il resto che non appartiene alla risposta potrebbe essere scritto meglio sull'oggetto richiesta o sul middleware di sessione.

Per risolvere le dipendenze circolari tra middleware, si può implementare un middleware che dovrebbe essere eseguito all'inizio. Questo middleware può fare una "raccolta dei requisiti" sulla richiesta, decidere quale altro middleware sarà potenzialmente attivato e quindi impostare vari flag sull'oggetto richiesta.

Questo middleware di "raccolta dei requisiti" dovrebbe evitare di eseguire il lavoro effettivo che causa la dipendenza circolare.

Il problema dell'autenticazione non è unico per nessun paradigma. Si tratta di un problema generale di progettazione dell'interfaccia utente che interessa ogni applicazione in cui l'utente non ha bisogno di autenticare in anticipo.

Il problema principale è questo. Dopo che l'utente ha navigato su una pagina e quella pagina contiene elementi che potenzialmente potrebbero richiedere l'autenticazione, le domande sono:

  1. Come consentire all'utente di scoprire facilmente se l'app si trova in uno stato autenticato o meno (ad esempio, consentire all'utente di vedere se è "connesso" o meno)
  2. Come comunicare all'utente che ci sono tali elementi (che richiederebbero l'autenticazione)?
    • Nascondendolo completamente?
    • Mostra un riquadro che sfuma sopra di esso (ma suggerisce ancora l'esistenza di ciò che è di seguito) e mette un pulsante di accesso in cima? (Non ci sarebbero informazioni specifiche dell'utente nel contenuto sfocato.)
    • Mostra l'elemento con le stringhe segnaposto
  3. L'utente deve essere costretto ad autenticare? Se è così,
    • Questo dovrebbe accadere quando la pagina viene caricata?
    • Oppure solo quando l'utente fa clic sull'elemento (o su un pulsante "Accedi"?)
  4. Esistono modi meno intrusivi per autenticare l'utente?
    • Questo comprometterà la sicurezza? I benefici superano i rischi?
risposta data 28.05.2015 - 10:37
fonte
0

Tra le altre cose (un motore di template, un linguaggio OO, un contenitore di applicazioni, ecc.), php funziona abbastanza bene come middleware.

Una semplice classe / script php che associa la tua funzionalità a classi php o script o risorse funzionerebbe correttamente. (Dopo tutto questo è il paradigma usato dai framework Python di maggior successo e ammirati!)

Java, J2EE ecc. necessitano di motori di template, middleware complessi, contenitori di applicazioni ecc. perché non sono supportati in modo nativo. PHP, d'altra parte, supporta tutto ciò che è necessario per presentare le pagine Web in modo controllato.

Qualsiasi middleware che usi sarà più complesso e difficile da gestire rispetto alla semplice codifica di un semplice script PHP vecchio che fa la stessa cosa.

    
risposta data 28.05.2015 - 12:51
fonte

Leggi altre domande sui tag