2016-02-25 45 views
11

Utilizzo di uno stack nodo-redux. Abbiamo creatori di azioni sul lato client e riduttori + redux state sul back-end. Ho la seguente proposta per l'attuazione permesso:Gestione autorizzazione in redux

  1. azioni sono creati lato client, questi possono essere dannosi, anche da utenti autenticati.
  2. Le azioni vengono inviate al server.
  3. La richiesta è autenticata lato server e le autorizzazioni dell'utente accertate.
  4. Le azioni passano attraverso il middleware di Redux che risiede all'interno del server di nodi.
  5. Il middleware controlla le autorizzazioni dell'utente rispetto all'autorizzazione specificata per il tipo di azione.
  6. Se l'utente dispone delle autorizzazioni corrette per l'azione, i riduttori creano un nuovo stato di ridondanza (che risiede anche sul server).


Problema:

Ogni tipo di azione è accoppiato ad una serie di autorizzazioni, questo significa che abbiamo bisogno di fare molta attenzione creando i nostri riduttori in modo che non abbiamo mai permettere un'azione da fare più di quanto dovrebbe Con più sviluppatori sul team e una grande applicazione non sono convinto che sia sufficiente.

Domande:

  • C'è una buona risorsa/legame con una buona discussione sui permessi di manipolazione con redux.
  • È sufficiente il redux per gestire autorizzazioni complesse?
  • Se controlliamo i permessi come descritto sopra, ci sono dei problemi che non ho menzionato e c'è un modo migliore per avvicinarsi a questo mentre si usa ancora il redux?
  • +0

    Cosa speri di proteggere mantenendo le azioni e lo stato sul server, oltre a proteggere qualsiasi endpoint REST esposto dal server? – Tyrsius

    +0

    I riduttori utilizzati sul server saranno quelli attualmente utilizzati dalla nostra applicazione lato client. Fare le cose in questo modo significa che i riduttori front-end che costruiamo sono sufficienti per mantenere lo stato lato server. L'opzione due è quella di creare una pausa per le nostre azioni. Questo ci rallenterà e significherebbe più hotplate per ogni azione che definiamo. – Eoin

    risposta

    5

    Redux è "permesso agnostico". Redux è solo un framework per il coordinamento di azioni che aggiornano lo stato dell'applicazione; non contiene opinioni o raccomandazioni su come avvicinarsi permettendo tali azioni.

    Risposte

    C'è una buona risorsa/legame con una buona discussione sui permessi di movimentazione con redux.

    Here is one.

    L'autorizzazione è una cosa molto difficile da fare proclami generali, poiché dipende molto dalle esigenze aziendali. Stai usando i ruoli? Stai solo richiedendo l'autenticazione? Gli utenti possono avere più ruoli o solo uno? Come interagiscono più ruoli? Queste non sono domande con una risposta.

    È sufficiente il redux per gestire autorizzazioni complesse?

    Questo è come chiedere se JavaScript è sufficiente per gestire autorizzazioni complesse. Non ha davvero senso.

    Da una prospettiva, è "possibile" gestire autorizzazioni complesse: sì. Redux non limiterà nessuno schema di permessi che desideri implementare a livello di azione, poiché le azioni sono solo funzioni che chiamano dispatch (un'altra funzione). È possibile utilizzare le azioni per interrompere la chiamata di spedizione per qualsiasi motivo.

    Da un altro punto di vista, Redux fornisce un meccanismo pronto all'uso in grado di gestire autorizzazioni complesse senza schemi o strumenti aggiuntivi: no. Redux non tenta nemmeno di affrontare questo problema, dipende interamente da te.

    Se controlliamo autorizzazioni come sopra delineati ci sono problemi che non ho citato e c'è un modo migliore di affrontare questo pur utilizzando redux?

    Ci sono sicuramente problemi che non hai menzionato, dal momento che non hai delineato completamente la tua implementazione. Come si suol dire, il diavolo è nei dettagli. In che modo ottieni ciò che hai descritto determinerà quali altri problemi incontrerai.

    C'è un modo migliore? "Meglio" è approssimativo come si può ottenere. Quali sono i tuoi parametri per "meglio"? In un compromesso tra velocità di sviluppo e prestazioni in fase di esecuzione, quale preferiresti? In un compromesso tra il numero di chiamate al server e la granularità dell'autorizzazione, quale preferiresti?

    Tutto ciò che hai detto è che stai controllando le azioni sul server. Senza sapere quale sia il tuo modello di autorizzazione, è impossibile dire se esiste un modo migliore, anche quando definisci con precisione "migliore", perché non sappiamo cosa stai facendo.

    Tuttavia, date le informazioni che hai, e supponendo che facendo il lato server di controllo è necessario e risparmio di tempo (un altro grande ipotesi), vorrei dire (come debolmente come possibile può) , ci sarà essere ulteriori problemi Per citarne alcuni:

    • Latenza. Redux si aspetta l'intero stato dell'app, compreso il valore dei campi di input. Il tuo modello controlla il server su ogni azione, quindi sviluppando in modo estremamente ridondante ogni battitura andrà al server per garantire che sia consentito aggiornare l'input. Ciò renderà l'interazione dell'utente molto lenta e molto frustrante.
    • Larghezza di banda. Questo consumerà molta larghezza di banda, per il motivo come sopra.
    • CPU. Questo sarà molto intenso per la CPU del server, per la ragione sopra.

    Una grande vittoria nelle applicazioni lato client è che il server esegue solo il lavoro necessario: servire i dati (in un formato minimo come json) e verificare le richieste di aggiornamento dei dati. Stai per svolgere il lavoro aggiuntivo di eseguendo tutti i tuoi client. Questo è un compromesso discutibile per ridurre la piastra della caldaia di scrivere una API REST.

    Questo ti bloccherà anche nella tua action api, e ridonderà. Una API REST ha il vantaggio di essere indipendente dal client.Se cambi da redux, o semplicemente riorganizzi le tue azioni, l'API REST sul server non ha bisogno di cambiare (o almeno, non c'è bisogno di cambiare tanto). Questo renderà il refactoring, anche se rimani con il redux, doloroso. Che questo superi o meno il dolore di scrivere una API REST è impossibile da dire, ma è qualcosa da considerare.