Zend ACL ile başlamak için rehberlik gerekir

2 Cevap php

Şu anda ACL gerektiren bir site üzerinde çalışıyorum ve ben Zend kullanıyorum gibi beni kendi ACL sınıfının yararlanmak için, mantıklı ama ben bunu nasıl sıfır fikrine biraz var. Ben dokümanlar okudum ama beni daha karıştı ... temelde yapmak istediğiniz tüm iki kullanıcı grubu örneğin kurmak için "Normal" ve "admin", normal kullanıcılar yönetici açıkça yönetici denetleyici sayfalarına erişebilirsiniz ise yönetici olmayan bir denetleyici var bütün sayfaları erişebilirsiniz.

Ben birçok soru var:

  1. Bunu nasıl kurarım?
  2. Ben bir DB veya Config.ini aracılığıyla çalıştırmak gerekir?
  3. Nerede benim ACL.php yerleştirebilirim?
  4. Ben nasıl böyle bir senaryo yazabilirim?
  5. Sonra diyorsunuz nasıl bu Endeksinde yapılır?.

Ben çok bir web sitesi ya da iyi bir öğretici kılavuz beni seviniriz.

2 Cevap

Ben çok uzun zaman önce benzer bir şey uygulanmaktadır. Temel kavram bir örnek kod izler.

Ben, önyükleme dosyasında yüklü benim durumumda index.php benim kendi configAcl.php dosyası oluşturdu. İşte bu durumda uygun olurdu nasıl:

$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);

Tüm denetleyicileri normal kullanıcı sadece "liste" eylem izin vermek istiyorsanız başka bir durumdur. Bu oldukça basit, böyle satır eklemek istiyorum:

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

Sonra bazı denetleyici eylem için bir istek olduğunda otomatik olarak kontrol kimlik ilgilenir yeni eklenti oluşturmak gerekir. Bu kontrol kontrolör her eylem çağrısı önce denir preDispatch () yöntemiyle gerçekleşir.

İşte AuthPlugin.php olduğunu:

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('/');
            }
        }
    }
}

Final adımlar configAcl.php yükleme ve önyükleme dosyası (muhtemelen index.php) olarak AuthPlugin kayıt edilir.

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

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

Yani bu temel kavramdır. Ben yukarıdaki kodu test vermedi (kopyalama ve yapıştırma ve sadece vitrin amaç için yeniden) bu yüzden kurşun geçirmez değil. Sadece bir fikir vermek için.

EDIT

Netlik için. AuthPlugin yukarıda kod $ kimlik nesnesi (veritabanı "rol" sütunu) kullanıcı verileri ile dolu olduğunu varsayalım. Bu, böyle giriş süreci içinde yapılabilir:

[...]
$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);
[...]

Bu çözüm Zend_Acl basit uygulama olarak kanıtlamak olabilir.

Örnek:

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 / Aksiyon / Yardımcı / 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($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;

    }

}