2010-07-19 9 views
6

Desidero essere in grado di mostrare o nascondere determinati elementi in una vista basata su ACL. Ad esempio, se un utente sta guardando la mia vista Utenti/indice, non voglio mostrare un elemento 'Elimina utente' se non ha il permesso di cancellare utenti. Se dispone dell'autorizzazione per modificare gli utenti, I do desidera visualizzare un collegamento "Modifica utente".Modifica visualizzazione basata su ACL in CakePHP

Posso incidere questo insieme, ma essendo molto nuovo per Cake spero che ci sia una soluzione elegante. Il meglio che ho fatto implica mantenere la logica in due punti, quindi è un inferno da mantenere.

Grazie!

risposta

1

Non esiste una "soluzione elegante" generica :) Ho sempre voluto fare anche questo. In ogni caso come si potesse fare:

sovrascrivere il Helper Html nella directory app - fare una copia da /cake/libs/views/helpers/html.php a /app/views/helpers/html.php e fatto qualche modifiche nella funzione Html :: link.

Ad esempio, è possibile controllare se l'URL contiene azioni di modifica o eliminazione.

L'altra parte deve passare i parametri corretti dal controller. In AppController :: beforeFilter puoi leggere i diritti dell'utente (è meglio essere memorizzati nella cache) e passarlo in una variabile di autenticazione speciale alla vista.

Quindi, quando si dispone dei diritti nella visualizzazione, è facile modificare il collegamento. :)

Come ho detto, non l'ho fatto nel vero esempio, ma questo è il modo in cui lo farei.

C'è un punto negativo in questo: se l'helper HTML originale viene modificato, quello resterà lo stesso. Ma credo che l'helper HTML sia abbastanza maturo, quindi per me non è un grosso problema.

1

Lo faccio in app_controller.php, anche se potreste farlo anche su controller specifici. Le variabili di visualizzazione $usersIndexAllowed e $configureAllowed vengono quindi utilizzate nelle istruzioni condizionali nella vista.

function beforeRender() 
{ 
    if($this->layout=='admin') 
    { 
     $usersIndexAllowed = $this->Acl->check($user,"users/index"); 
     $configureAllowed = $this->Acl->check($user,"siteAdmins/configure"); 
    } 
    $this->set(compact('usersIndexAllowed','configureAllowed')); 
} 
1

Nel caso in cui non si vuole pasticciare con aiutanti fondamentali imperative e volete un modo più automatico di controllo (senza codificare i nomi dei gruppi di utenti e utenti o l'impostazione di variabili specifiche-link separati) ecco la mia Suggerimento:

Archivia tutte le autorizzazioni utente come vars di sessione quando l'utente esegue l'accesso (cancella al logout) e crea un helper di autorizzazioni per verificare se l'utente connesso ha le autorizzazioni per un'azione specifica.

codice e l'esempio here

speranza che aiuta

0

Non c'è più approcci a questo scenario. Come diceva Nik, usare un helper per fare i controlli per te è un modo rapido per "esternalizzare" la logica e centralizzarla per facilità d'uso.

In realtà, dai uno sguardo allo AclLinkHelper - fa esattamente quello che stai cercando, ma limitato ai soli collegamenti.

4

So che questa è una vecchia domanda ora ma per chiunque cerchi un modo come lo ero io ...

In AppController :: beforeFilter è possibile assegnare il componente ACL per una variabile vista e poi utilizzarlo nella vostra vista:

$this->set('user', $this->Auth->user());  
$this->set('acl', $this->Acl); 

E poi in voi visualizzare solo Juse piace thie:

if($acl->check(array('User' => $user), 'controllers/groupd/admin_delete')) { 

Questo è necessariamente il modo più corretto per farlo, ma funziona bene

Problemi correlati