Frage

Zur Zeit arbeite ich auf einer Website, die ACL erfordert und, wie ich bin mit Zend, macht es Sinn für mich nutzt ihre ACL-Klasse zu machen, aber ich habe wenig auf Null Vorstellung davon, wie dies zu tun. Ich habe die Dokumente lesen, aber es verwirrt mich weiter ... im Grunde alles, was ich tun möchte, zwei Benutzergruppen einzurichten, ist z.B. „Normal“ und „admin“, normale Benutzer alle Seiten zugreifen können, die einen Controller, der nicht Administrator ist, während Admin offensichtlich die Admin-Controller-Seiten zugreifen kann.

Ich habe viele Fragen:

  1. Wie kann ich diese auf?
  2. Sollte ich es durch einen DB oder der config.ini?
  3. Wo platziere ich meine acl.php?
  4. Wie kann ich ein solches Skript schreiben?
  5. Wie kann ich dann aufrufen, wird dies im Index getan?.

Ich würde mich sehr freuen, wenn Sie mich auf eine Website oder ein gutes Tutorial führen.

War es hilfreich?

Lösung

I umgesetzt ähnliche Sache nicht so lange her. Grundkonzept folgt in einem Beispiel-Code.

ich meine eigene configAcl.php-Datei erstellt, die in Bootstrap-Datei geladen wird, in meinem Fall ist es index.php. Hier ist, wie würde es zu einem Fall werden nach:

$acl = new Zend_Acl();

$roles  = array('admin', 'normal');

// Controller script names. You have to add all of them if credential check
// is global to your application.
$controllers = array('auth', 'index', 'news', 'admin');

foreach ($roles as $role) {
    $acl->addRole(new Zend_Acl_Role($role));
}
foreach ($controllers as $controller) {
    $acl->add(new Zend_Acl_Resource($controller));
}

// Here comes credential definiton for admin user.
$acl->allow('admin'); // Has access to everything.

// Here comes credential definition for normal user.
$acl->allow('normal'); // Has access to everything...
$acl->deny('normal', 'admin'); // ... except the admin controller.

// Finally I store whole ACL definition to registry for use
// in AuthPlugin plugin.
$registry = Zend_Registry::getInstance();
$registry->set('acl', $acl);

Ein weiterer Fall ist, wenn man nur normale Benutzer erlauben will „Liste“ Aktion auf allen Controllern. Es ist ziemlich einfach, Sie Zeilen wie diese hinzufügen würden:

$acl->allow('normal', null, 'list'); // Has access to all controller list actions.

Als nächstes sollten Sie neue Plugin erstellen, die Pflege der Berechtigungsnachweis nimmt prüft automatisch, wenn es eine Anforderung für einige Controller-Aktion ist. Diese Überprüfung erfolgt in preDispatch () -Methode, die vor jedem Aufruf an die Controller-Aktion aufgerufen wird.

Hier ist AuthPlugin.php:

class AuthPlugin extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $loginController = 'auth';
        $loginAction     = 'login';

        $auth = Zend_Auth::getInstance();

        // If user is not logged in and is not requesting login page
        // - redirect to login page.
        if (!$auth->hasIdentity()
                && $request->getControllerName() != $loginController
                && $request->getActionName()     != $loginAction) {

            $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
            $redirector->gotoSimpleAndExit($loginAction, $loginController);
        }

        // User is logged in or on login page.

        if ($auth->hasIdentity()) {
            // Is logged in
            // Let's check the credential
            $registry = Zend_Registry::getInstance();
            $acl = $registry->get('acl');
            $identity = $auth->getIdentity();
            // role is a column in the user table (database)
            $isAllowed = $acl->isAllowed($identity->role,
                                         $request->getControllerName(),
                                         $request->getActionName());
            if (!$isAllowed) {
                $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
                $redirector->gotoUrlAndExit('/');
            }
        }
    }
}

Letzte Schritte sind Ihre configAcl.php Laden und die AuthPlugin in Bootstrap-Datei registrieren (wahrscheinlich index.php).

require_once '../application/configAcl.php';

$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new AuthPlugin());

Das ist also das Grundkonzept. Habe ich nicht getestet, den Code oben (kopieren und einfügen und nur für die Vitrine Zweck umschreiben), so ist es nicht kugelsicher. Nur eine Idee zu geben.

Bearbeiten

Für die Klarheit. Der obige Code in AuthPlugin annimmt, dass das $ Identitätsobjekt mit Benutzerdaten gefüllt ist ( „Rolle“ Spalte in der Datenbank). Dies könnte in dem Login-Vorgang wie folgt durchgeführt werden:

[...]
$authAdapter = new Zend_Auth_Adapter_DbTable($db);
$authAdapter->setTableName('Users');
$authAdapter->setIdentityColumn('username');
$authAdapter->setCredentialColumn('password');
$authAdapter->setIdentity($username);
$authAdapter->setCredential(sha1($password));
$authAdapter->setCredentialTreatment('? AND active = 1');
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
    $data = $authAdapter->getResultRowObject(null, 'password'); // without password
    $auth->getStorage()->write($data);
[...]

Andere Tipps

Diese Lösung unter Beweis stellen kann die einfachste Implementierung von Zend_Acl sein.

Beispiel:

class UserController extends Zend_Controller_Action {

    public function preDispatch(){

        $resource = 'user_area';
        $privilege = $this->_request->getActionName();
        if (!$this->_helper->acl($resource, $privilege)) $this->_redirect();

    }

}

Zend / Controller / Action / Helper / acl.php

class Zend_Controller_Action_Helper_Acl extends Zend_Controller_Action_Helper_Abstract {

    protected $acl;
    protected $role;

    protected function getAcl(){

        if (is_null($this->acl)){

            $acl = new Zend_Acl();

            $acl->addResource(new Zend_Acl_Resource('user_area'));
            $acl->addResource(new Zend_Acl_Resource('customer_area'), 'user_area');
            $acl->addResource(new Zend_Acl_Resource('web_area'));

            $acl->addRole(new Zend_Acl_Role('guest'));      
            $acl->addRole(new Zend_Acl_Role('user'), 'guest');

            $acl->allow('guest', 'web_area');
            $acl->allow('guest', 'user_area', array(
                'forgot-password',
                'login'
            ));
            $acl->allow('user', 'user_area');
            $acl->allow('customer', 'customer_area');

            $this->acl = $acl;

        }

        return $this->acl;

    }

    protected function getRole(){

        if (is_null($this->role)){

            $session = new Zend_Session_Namespace('session');
            $role = (isset($session->userType)) ? $session->userType : 'guest';
            $this->role = $role;

        }

        return $this->role;

    }

    public function direct($resource, $privilege = null){

        $acl = $this->getAcl();
        $role = $this->getRole();
        $allowed = $acl->isAllowed($role, $resource, $privilege);
        return $allowed;

    }

}

Mit dieser Struktur spielen. erhalten Rolle und Ressourcen aus der Datenbank und speichert diese in der Sitzung für oder jedes Caching. eingeben Bild Beschreibung hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top