2010-07-19 21 views
6

Ich möchte bestimmte Elemente in einer Ansicht basierend auf ACL ein- oder ausblenden können. Wenn ein Benutzer beispielsweise meine Benutzer-/Indexansicht betrachtet, möchte ich kein Element "Benutzer löschen" anzeigen, wenn er keine Berechtigung zum Löschen von Benutzern hat. Wenn er hat haben die Berechtigung zum Bearbeiten von Benutzern, ich tun möchte einen Link 'Benutzer bearbeiten' anzeigen.Ändern der Ansicht basierend auf ACL in CakePHP

Ich kann das zusammen hacken, aber sehr neu zu Cake Ich hoffe, dass es eine elegante Lösung gibt. Das Beste, was ich getan habe, besteht darin, Logik an zwei Stellen zu halten, also ist es die Hölle, die es zu halten gilt.

Danke!

Antwort

1

Es gibt keine generische "elegante Lösung" :) Ich wollte schon immer so etwas machen. Wie auch immer du es machen könntest:

Überschreibe den Html Helper in deinem App-Verzeichnis - erstelle eine Kopie von /cake/libs/views/helpers/html.php nach /app/views/helpers/html.php und erstelle ein paar Änderungen in der Html :: Link-Funktion.

Zum Beispiel können Sie überprüfen, ob die URL Aktion bearbeiten oder löschen enthalten.

Der andere Teil besteht darin, die richtigen Parameter vom Controller zu übergeben. In AppController :: beforeFilter können Sie die Rechte des Benutzers lesen (es ist besser zwischengespeichert zu werden) und diese in einer speziellen Auth-Variablen an die View übergeben.

Wenn Sie also die Rechte in Ihrer Ansicht haben, ist es einfach, den Link zu ändern. :)

Wie gesagt ich habe es nicht im realen Beispiel gemacht, aber so würde ich es machen.

Es gibt einen schlechten Punkt darin - wenn der ursprüngliche HTML-Helfer geändert wird, bleibt Ihr einer derselbe. Aber ich glaube, dass HTML-Helfer reif genug ist, also ist für mich kein großes Problem.

1

Ich mache es so in app_controller.php, obwohl Sie es auch in bestimmten Controllern tun könnte. Die View-Variablen $usersIndexAllowed und $configureAllowed werden dann in bedingten Anweisungen in der Ansicht verwendet.

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

Falls Sie wollen nicht mit zwingenden Kern Helfer herum zu verwirren und Sie wollen eine automatische Weise (ohne Hartcodierung Benutzergruppennamen und Benutzer oder separaten Link spezifischen Variablen Einstellung) des Prüfens hier ist mein Vorschlag:

Speichern Sie alle Benutzerberechtigungen als Sitzungsvars, wenn sich der Benutzer anmeldet (beim Abmelden löschen), und erstellen Sie einen Berechtigungshelfer, um zu überprüfen, ob der angemeldete Benutzer über Berechtigungen für eine bestimmte Aktion verfügt.

Code und Beispiel here

Hoffnung, die

0

Es gibt mehrere Ansätze für dieses Szenario hilft. Wie Nik sagte, ist die Verwendung eines Helfers, um die Überprüfungen für Sie durchzuführen, ein schneller Weg, um die Logik "auszulagern" und sie für Benutzerfreundlichkeit zu zentralisieren.

Werfen Sie einen Blick auf die AclLinkHelper - es tut genau das, was Sie suchen, aber nur auf Links beschränkt.

4

Ich weiß, das ist jetzt eine alte Frage, aber für jeden, der nach einem Weg sucht, wie ich war ...

In AppController :: before Sie die ACL-Komponente zu einer Ansicht Variablen zuweisen können und es dann in der Ansicht verwenden:

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

Und dann in Sie es wie thie nur ansehen Juse:

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

Dies ist nicht unbedingt der korrekteste Weg, aber es funktioniert gut

Verwandte Themen