Controllori multipli per la stessa risorsa in base al ruolo dell'utente

5

Ho problemi a progettare questa applicazione basata su ruoli (o permessi), quando si tratta di capire come gestire azioni che differiscono per ruolo.

Ad esempio, il nostro controller è App\ResourceController , e modificheremo la risorsa. Esistono 2 ruoli: admin e user . Il admin è autorizzato a modificare ogni campo della risorsa, mentre user è limitato ad alcuni di essi .

Sto cercando di capire quale sia l'approccio migliore tra l'implementazione di un singolo controller che gestirà entrambi i casi o il routing della richiesta a un controller diverso per la stessa risorsa (come App\Admin\ResourceController , App\User\ResourceController ).

Il problema con l'approccio a controller singolo è che non si tratta solo di mostrare una forma diversa (con campi limitati) in base al ruolo, ma anche di convalidare campi diversi e altro ancora. Il corpo del controllore assomiglierebbe a una grande dichiarazione if-else .

Il controller multiplo è l'approccio corretto, oppure ce n'è uno diverso che usa le autorizzazioni invece dei ruoli?

    
posta Christopher Francisco 11.12.2015 - 17:35
fonte

2 risposte

1

Questo dipenderà in gran parte dal framework MVC che stai utilizzando. Il framework ASP.NET MVC in .NET, ad esempio, ha un sistema di autorizzazioni incorporato (chiamato ruoli). Potresti utilizzare un controller con più metodi:

public class ResourceController : Controller
{
    [Authorize(Roles = "User")]
    public ActionResult CreateAsUser()
    {
        // ...
    }

    [Authorize(Roles = "User")]
    [HttpPost]
    public ActionResult CreateAsUser(ResourceModel model)
    {
        // ...
    }

    [Authorize(Roles = "Admin")]
    public ActionResult CreateAsAdmin()
    {
        // ...
    }

    [Authorize(Roles = "Admin")]
    [HttpPost]
    public ActionResult CreateAsAdmin(ResourceModel model)
    {
        // ...
    }
}

La maggior parte dei framework MVC con funzionalità complete avrà una sorta di sistema di permessi basato sui ruoli incorporato che è possibile utilizzare. In realtà, il tuo prossimo passo è identificare il framework MVC che stai usando (o decidere quale usare adesso sapendo che ha bisogno di permessi basati sui ruoli) e fare qualche ricerca su come implementare tali permessi.

    
risposta data 11.12.2015 - 19:06
fonte
0

In generale, la tua scelta dovrebbe essere per manutenibilità e semplicità. Nel caso in cui descrivi sembra che la complessità aggiunta dal tentativo di combinare i controller non varrà la complessità aggiunta nel lungo periodo.

Detto questo, fare la scelta pratica tra gli approcci descritti dipende dal numero di elementi che differiscono per utente e amministratore. Se quel numero è piccolo, la complessità aggiunta potrebbe essere utile.

Se utilizzi un ambiente orientato agli oggetti, una terza opzione potrebbe essere l'ereditare App\Admin\ResourceController da App\User\ResourceController .

    
risposta data 11.12.2015 - 19:02
fonte

Leggi altre domande sui tag