Qual è il modo corretto di implementare Auth / ACL in MVC?

7

Sto cercando di creare un sistema MVC Auth / ACL correttamente impostato. Io penso voglio che l'autenticazione di un utente (e la gestione della sessione) sia separata dal sistema ACL. (Non so perché, ma questa sembra una buona idea dalle cose che ho letto.)

Che cosa ha a che fare MVC con questa domanda che chiedi? Perché desidero che l'applicazione sia ben integrata con il mio ACL. Un esempio di controller (CodeIgniter):

<?php
class forums extends MX_Controller
{
    $allowed = array('users', 'admin');
    $need_login = true;

        function __construct()
        {
        //example of checking if logged in.
            if($this->auth->logged_in() && $this->auth->is_admin())
        {
            echo "you're logged in!";
        }
    }
    public function add_topic()
    {
        if($this->auth->allowed('add_topic')
        {
            //some add topic things.
        }
        else
        {
            echo 'not allowed to add topic';
        }
    }
}
?>

I miei pensieri

$this->auth verrebbe caricato automaticamente nel sistema. Vorrei controllare la matrice $allowed contro l'utente attualmente (non) loggato e reagire di conseguenza.

È un buon modo di fare le cose? Non ho visto molta letteratura sull'integrazione MVC e su Auth. Voglio rendere le cose il più semplici possibile.

    
posta WiseStrawberry 09.07.2012 - 17:21
fonte

2 risposte

4

Il mio approccio all'interno di Zend Framework è stato quello di avere una classe base di SecureController che deve estendersi a tutti i controller che richiedono l'autenticazione. Nel SecureController ho un controllo di autenticazione pre-dispatch per verificare se un utente è loggato in un'altra posizione alla pagina di accesso.

Una volta completato il controllo dell'accesso, eseguo un controllo di autorizzazione se l'utente può accedere alla risorsa e all'azione, il controller è in genere collegato a una singola risorsa (ma questo comportamento può essere ignorato) e l'azione del controller può essere mappato a un'azione di risorsa.

Con questa soluzione, l'unica cosa che devo fare in ogni controller figlio è mappare la risorsa e l'azione su ciò che viene fatto senza dover mai richiamare nuovamente i controlli di sicurezza.

Se ho bisogno di controlli ACL specifici, specialmente nella generazione della vista, posso usare l'istanza Zend_ACL che è legata alla sessione dell'utente

    
risposta data 14.10.2012 - 20:24
fonte
1

Ho provato a venire con le mie spiegazioni, ma ho trovato un post davvero completo nel mezzo della compilazione della mia risposta. Spero che troverai più di quanto hai chiesto in questo post: implementazione ACL PHP

Edir: In sostanza, l'idea dietro il post suggerisce di utilizzare pattern di decorazione (guarda Wiki per maggiori informazioni). Nel concetto semplice questo modello consiglia di prendere il tuo oggetto, e metterlo all'interno di un altro oggetto, che agirà come un guscio protettivo. In questo modo, il tuo codice non sarebbe richiesto per estendere la classe originale.

    
risposta data 09.07.2012 - 17:34
fonte

Leggi altre domande sui tag