Un controller per domarli tutti?

4

Sto sviluppando un'applicazione a pagina singola. La pagina ha una barra degli strumenti. Quando l'utente fa clic su qualsiasi pulsante, crea visivamente una scheda e attiva una richiesta Ajax sul controller richiesto. Ora due cose: in primo luogo, l'utente deve sempre essere autenticato e, in secondo luogo, non tutti gli utenti hanno accesso a ciascuna funzionalità. Nella prima bozza di questa applicazione, non ho avuto molto tempo per pensarci, e ho scritto una funzione Javascript il cui corpo era principalmente una struttura Switch che chiamava il controller giusto in base al pulsante su cui era stato fatto clic. Non sono uno sviluppatore web, ma ritengo che questa soluzione sia negativa per almeno tre motivi:

  1. La più ovvia: ho un altro file da modificare se cambio o aggiungo qualche controller.
  2. Questo rivela l'URL di tutti i controller esistenti a chiunque legga il codice della pagina.
  3. Devo fare gli stessi controlli di sicurezza in ogni controller.

Ho immaginato il seguente scenario ... e se, dopo l'autenticazione, avessi solo un controller che controlla se la funzionalità richiesta è disponibile per l'utente connesso e solo allora chiama il codice corretto (controller? simple class?) e restituire il risultato di questo codice. Questo codice non sarebbe mai accessibile dall'esterno, solo internamente.

Mi sono appena confuso con MVC e il pattern SPA?

    
posta Yugo Amaryl 03.02.2015 - 12:44
fonte

3 risposte

2

Se implementato correttamente, MVC può certamente soddisfare le tue esigenze.

Come stai facendo l'autenticazione? Se si utilizza la funzionalità MVC integrata, è sufficiente aggiungere un attributo [Authorize] a ciascun controller oa ciascun metodo. Tutto il codice per la convalida è quindi curato.

Inoltre, puoi creare un BaseController , da cui erediterà ogni controller. Questo può quindi essere usato per evitare codice ripetitivo, come l'impostazione di variabili comuni, l'autenticazione personalizzata, ecc.

Vedi questa domanda per un buon esempio di BaseController e una discussione sul loro utilizzo.

    
risposta data 03.02.2015 - 17:21
fonte
0

Senza conoscere troppo il tuo progetto suggerirei una soluzione generica per questo tipo di problemi. / Nota questo potrebbe non essere il migliore in tutti i casi /

Poiché hai detto che l'autenticazione viene eseguita in ogni caso, ovviamente può essere fatto separatamente per evitare la duplicazione e la complessità del codice.

Dopo l'autenticazione basata sui diritti degli utenti, generi un codice temporaneo.

Quindi memorizzi separatamente il valore del pulsante su cui è stato fatto clic.

Ora hai due numeri (codici): i tuoi diritti utente e il pulsante cliccato = > un caso classico di tabella di ricerca 2D . Dove i due codici incontrano hai una chiamata di funzione (o qualsiasi altra cosa tu voglia fare).

BTW: Se hai casi di switch di grandi dimensioni o istruzioni if di grandi dimensioni, questi possono essere sostituiti quasi sempre con una tabella di ricerca, che è molto più efficiente. Nel tuo caso potrebbe essere solo un array 2D.

pseudo-codice:

FunctionalityTable[][] =
{
    {event1(), notAllowed(), notAllowed()},
    {event2(), event2(), notAllowed()},
    ...
};

int rights = authenitcate().toInt();

int option = getButtonPressed().toInt();

FunctionalityTable[rights][option];
    
risposta data 03.02.2015 - 17:35
fonte
0

Il tuo controller sta semplicemente alimentando i dati sul tuo sito web. Il modo in cui viene presentato dipende interamente da te, che si tratti di una SPA o di qualsiasi altra cosa tu voglia utilizzare. In questo senso, sei più che benvenuto a utilizzare MVC perché in che modo la tua vista è strutturata è indipendente dal design sottostante dell'utilizzo di un controller.

La struttura dell'interruttore che determina il controllore da chiamare in base al pulsante su cui è stato fatto clic suona come se appartenesse al motore di routing. Ogni pulsante dovrebbe formare una richiesta URI che viene inviata al server web. Il server Web utilizza quindi le informazioni di routing per chiamare il controller e il metodo sottostanti in base a tale configurazione. Ovviamente ogni nuovo pulsante farà cose nuove, e come tale richiederà un nuovo metodo di controllo.

Come vuoi strutturare logicamente i tuoi controllori dipende da te. Con ASP.NET MVC è possibile dettare l'autorizzazione a livello di controller o di metodo. È possibile creare un singolo controller e utilizzare gli attributi Autorizza al livello del metodo. È possibile creare diversi controller in base ai livelli di autorizzazione (IE se si dispone di un'area Utente e Amministratore) e controllare l'autorizzazione a livello di controller. Una volta che hai accesso al controller, avrai accesso a tutti i suoi metodi.

Dai un'occhiata al link e vedi se riesci a trovare ulteriori informazioni che ti portano alla risposta giusta per il tuo problema specifico.

    
risposta data 03.02.2015 - 17:38
fonte

Leggi altre domande sui tag