L'uso di condizionali di sicurezza in una vista è una violazione di MVC?

10

Spesso ciò che viene visualizzato da un utente (ad esempio su una pagina Web) si baserà in parte sui controlli di sicurezza. Di solito considero la sicurezza a livello utente / ACL come parte della logica aziendale di un sistema. Se una vista controlla esplicitamente la sicurezza per visualizzare in modo condizionale gli elementi dell'interfaccia utente, sta violando MVC contenendo la logica aziendale?

    
posta Matt S 15.01.2013 - 16:32
fonte

7 risposte

6

Ci possono essere due tipi di condizionali di sicurezza, uno sul modello e un altro sulla vista. La vista controlla la visualizzazione degli elementi rilevanti in base alle autorizzazioni dell'utente corrente, ma il modello controlla l'accesso ai dati sottostanti. Finché il modello ha tutte le giuste verifiche / convalide, anche se manca la vista, c'è ancora sicurezza.

Di solito devi averli entrambi, dal momento che la vista deve cambiare per diversi livelli / ruoli. Il controller invia i dati rilevanti che cambierebbero la vista, ma la vista deve ancora fare qualcosa con quei dati per nascondere / mostrare il contenuto all'utente giusto.

Ecco perché la maggior parte dei framework di modelli ha elementi condizionali ( Handlebars esempio):

{{#if isCurrentUserAdmin}}
    ....
{{/if}

Questo significa che non si tratta di una violazione, a condizione che i pezzi appropriati siano nella posizione corretta.

    
risposta data 15.01.2013 - 16:43
fonte
4

Sì e no.

Se la decisione sulla sicurezza effettiva viene presa dalla vista, allora sì, stai violando MVC. Se, tuttavia, la vista delega la decisione effettiva al modello, allora stai bene. Non c'è nulla di sbagliato in una vista che prende decisioni su quali elementi mostrare, in base alle informazioni del modello.

Ad esempio, se hai un pulsante "modifica" che è visibile solo per gli utenti con permessi "editor", allora va bene per la vista chiedere al modello chi è l'utente corrente e se hanno l'editor permesso, quindi utilizzando queste informazioni per decidere se mostrare il pulsante o meno. Se, tuttavia, la vista dovesse eseguire autonomamente la logica di autenticazione e autorizzazione, violerebbe MVC.

    
risposta data 15.01.2013 - 18:09
fonte
2

Direi no .

Ma per un motivo diverso da quello che @rvcoutinho ha detto (anche se cita wikipedia che mi fa sentire male nel mio modo di pensare)

Direi che qualsiasi problema di sicurezza rilevante dovrebbe essere condiviso dal Modello dato alla vista (a seconda del numero di combinazioni che si potrebbe desiderare di utilizzare un ViewModel per questo motivo), in quanto si potrebbero avere interruttori per i bit di sicurezza.

Ciò consente la convalida della sicurezza a due livelli: sul livello dell'interfaccia utente, quindi, un postback viene sovvertito per il caso normale, così come a livello server per i cattivi attori in cui il modello mantiene le conoscenze sulla sicurezza all'interno di se stesso le informazioni sul modello che immediatamente lo lanciano.

La sicurezza a due livelli come questa è lo standard nel settore, e in questo modo la logica di sicurezza deve esistere solo in due punti, quindi è un vantaggio, non appena inserisci la logica di sicurezza nel controller, la stai mettendo lì, e nell'interfaccia utente e nel modello (il modello ne ha bisogno in quanto è l'ultima linea di difesa e particolarmente importante per qualsiasi utilizzo al di fuori di tale web-app MVC come un client desktop o qualsiasi strumento di gestione del server)

    
risposta data 15.01.2013 - 16:58
fonte
2

Direi no .

Di solito, questo tipo di controlli di sicurezza verranno eseguiti dal controller.

A partire da Wikipedia :

A controller can send commands to its associated view to change the view's presentation of the model

E non penso che dovrebbe essere fatto direttamente nella vista. Se è fatto tramite javascript, per esempio, potrebbe essere un problema di sicurezza (uno potrebbe disabilitare javascript e accedere a dati privilegiati).

Ancora, da Wikipedia :

A view requests from the model the information that it needs to generate an output representation.

    
risposta data 15.01.2013 - 16:38
fonte
1

Ci sono diversi problemi coinvolti in questa domanda.

  1. Autenticazione (questo utente che dice di essere) dovrebbe non essere un problema della vista.
  2. Autorizzazione (l'utente corrente è autorizzato a fare questo ) è una preoccupazione della vista, perché può influenzare ciò che viene presentato all'utente. Pertanto, il codice per la visualizzazione di un pulsante di modifica può essere circondato da un condizionale come if model.userCanEdit() ... endif .
  3. La determinazione di quali attributi di autorizzazione ha un utente, ovvero logica aziendale e deve essere inserita nel modello. (Ad esempio, il privilegio "modifica" richiede che tu abbia 2000 reputazione o che tu debba essere l'autore o un moderatore)
risposta data 15.01.2013 - 19:04
fonte
0

Se si tratta solo di visualizzare l'elemento dell'interfaccia utente, penso che sia ok (in quale altro modo lo faresti comunque?). Se ci fossero dei dati in questi elementi, il modello avrebbe dovuto assicurarsi che i contenitori fossero vuoti. E ovviamente il codice per ottenere i dati sui permessi avrebbe dovuto essere gestito prima della vista, quindi non c'è un accesso attivo al modello qui.

    
risposta data 15.01.2013 - 16:37
fonte
0

If a view explicitly checks security to conditionally display UI elements, is it violating MVC by containing business logic?

Sì, si tratta di una violazione di MVC.

La vista serve solo per visualizzare gli elementi e la logica dovrebbe essere nel modello. Avendo la vista fare qualcosa (nel tuo caso, controlla la sicurezza), stai inserendo la logica lì.

    
risposta data 15.01.2013 - 20:19
fonte

Leggi altre domande sui tag