2010-02-16 33 views
9

Uygulamamı Zend Framework'e temel aldım. Kimlik doğrulaması için Zend_Auth kullanıyorum, ancak Zend_Acl benim için çalışacağından emin değilim çünkü açıkçası, gördüğüm örnekler ihtiyaçlar için çok basit ya da kafamı karıştırıyor.Zend ACL ihtiyaçlar için uygun mu?

Ben Kaynaklar başvurum öğelerin düşünüyorum ve bu kaynaklar olabilir Ayrıcalıklar var. Kaynak Ayrıcalıklarını içeren roller, kullanıcılara atanan dinamik olarak tanımlanmıştır. Bu bilgiyi normalize edilmiş tablolarda saklıyorum.

  1. Kullanıcılar
  2. Kaynakları birden Ayrıcalıklar

Roller olabilir birden Kaynakları olabilir Rol

  • Bir Rol sahip hiyerarşi olmadan Kaynak Ayrıcalıklar gerçekten sadece koleksiyonları bulunmaktadır. Bir Kaynak örneği 'Sayfa' olacaktır. Herkes sayfaları görebilir, ancak kimliği doğrulanmış bir kullanıcının, sayfalarda başka bir şey yapmak için 'ekle', 'düzenle' veya 'silme' ayrıcalıklarına ihtiyacı olur.

    Bu, Zend ACL ile meshleniyor mu? ACL'yi benim için sorun yaratacak şekilde mi düşünüyorum?


    Benim Çözüm

    Typeonerror kredi alır, ama burada benim spesifik bir çözüm.

    class My_Acl extends Zend_Acl 
    { 
        protected $_role_id; 
    
        public function setRole($role_id) 
        { 
         $this->_role_id = $role_id; 
         return $this->addRole($role_id); 
        } 
    
        public function getRole() 
        { 
         return $this->_role_id; 
        } 
    
        public function deny($resource, $privilege) 
        { 
         return parent::deny($this->_role_id, $resource, $privilege); 
        } 
    
        public function allow($resource, $privilege) 
        { 
         return parent::allow($this->_role_id, $resource, $privilege); 
        } 
    
        public function isAllowed($resource, $privilege) 
        { 
         return parent::isAllowed($this->_role_id, $resource, $privilege); 
        } 
    } 
    

    Ben resource, privilege ve role_id sütun döndüren bir sorguyu yürütmek ACL doldurmak için: Sadece geçerli kullanıcı rolünü yüklenmesidir

    benim kullanımını kolaylaştırmak için Zend_Acl uzatıldı. Kullanıcının rolünün bu ayrıcalığa sahip olmaması durumunda role_id sütun sonuç kümesinde sıfırdır.

    $acl = new My_Acl(); 
    
    $auth = Zend_Auth::getInstance(); 
    if ($auth->hasIdentity()) { 
        $userInfo = $auth->getStorage()->read(); 
        $acl->setRole($userInfo->role_id); 
    } else { 
        $acl->setRole(''); 
    } 
    
    // QUERY HERE 
    
    foreach ($privileges as $privilege) { 
        if (!$acl->has($privilege['resource'])) { 
         $acl->addResource($privilege['resource']); 
        } 
        if (is_null($privilege['role_id'])) { 
         $acl->deny($privilege['resource'], $privilege['privilege']); 
        } else { 
         $acl->allow($privilege['resource'], $privilege['privilege']); 
        } 
    } 
    
  • cevap

    10

    Tam olarak böyle çalışır ve bence doğru bir şekilde düşünürsünüz. Kaynaklarınızı ekleyebilir ve ardından belirli kullanıcı rollerinin bunlara erişmesine izin vermek için ayrıcalıklar ekleyebilirsiniz. Örneğin, CMS’imde "geliştiriciler", "yöneticiler" ve "kullanıcılar" var. Aşağıdaki kodda genel erişim ekliyorum ve bazı kullanıcıların belirli erişiminden bazı işlemleri ve belirli yöntemleri kaldırın. Tabii ki bu benim uygulamam için oldukça özel bir durum, ama temel olarak, kullanıcının rolünü auth-> getIdentity() (veya benzeri) 'den almanız ve ardından rollerinizi/kaynaklarınızı veritabanından eklemeniz gerekir.

    <?php 
    
    /** 
    * @author  Benjamin Borowski <[email protected]> 
    * @copyright Copyright (c) Typeoneerror Studios http://typeoneerror.com 
    * @version $Id$ 
    * @category Typeoneerror 
    * @package Acl 
    */ 
    
    /** 
    * Defines basic roles and resources for an application as 
    * well as a Content Management System (CMS). 
    * 
    * Zend_Acl provides a lightweight and flexible access control list 
    * (ACL) implementation for privileges management. 
    * 
    * {@inheritdoc} 
    * 
    * @author  Benjamin Borowski <[email protected]> 
    * @copyright Copyright (c) Typeoneerror Studios http://typeoneerror.com 
    * @version $Id$ 
    * @category Typeoneerror 
    * @package Acl 
    */ 
    class Typeoneerror_Acl extends Zend_Acl 
    { 
        /** 
        * Constructor function. 
        * 
        * Creates basic roles and resources and adds them to Acl. 
        * 
        * {@inheritdoc} 
        * 
        * @return Typeoneerror_Acl 
        */ 
        public function __construct() 
        { 
         //--------------------------------------- 
         // ROLES 
         //--------------------------------------- 
    
         $this->_addRole("guest") 
          ->_addRole("member", "guest") 
          ->_addRole("admin", "member") 
          ->_addRole("developer", "admin"); 
    
         //--------------------------------------- 
         // FRONT-END RESOURCES 
         //--------------------------------------- 
    
         $this->_add("default"); 
    
         //--------------------------------------- 
         // BACK-END RESOURCES 
         //--------------------------------------- 
    
         $this->_add("cms") 
          ->_add("cms:articles", "cms") 
          ->_add("cms:auth", "cms") 
          ->_add("cms:bug-report", "cms") 
          ->_add("cms:calendar", "cms") 
          ->_add("cms:categories", "cms") 
          ->_add("cms:comments", "cms") 
          ->_add("cms:error", "cms") 
          ->_add("cms:galleries", "cms") 
          ->_add("cms:pages", "cms") 
          ->_add("cms:photos", "cms") 
          ->_add("cms:tags", "cms") 
          ->_add("cms:users", "cms"); 
    
         //--------------------------------------- 
         // GUEST PERMISSIONS 
         //--------------------------------------- 
    
         $this->allow("guest", "default") 
          ->allow("guest", "cms:auth")   // -- guests can attempt to log-in 
          ->allow("guest", "cms:error")   // -- guests can break stuff 
          ->allow("guest", "cms:bug-report"); // -- guests can report bugs 
    
         //--------------------------------------- 
         // ADMIN PERMISSIONS 
         //--------------------------------------- 
    
         $this->allow("admin") 
          ->deny("admin", null, "purge")      // -- admins cannot purge (normally) 
          ->deny("admin", "cms:comments", "create");   // -- only devs can create a comment 
    
         //--------------------------------------- 
         // DEVELOPER PERMISSIONS 
         //--------------------------------------- 
    
         $this->allow("developer");    // -- unrestricted access 
    
         return $this; 
        } 
    
        /** 
        * Adds a Resource having an identifier unique to the ACL. 
        * 
        * @param Zend_Acl_Resource_Interface $resource  The resource to add 
        * @param Zend_Acl_Resource_Interface|string $parent A parent resource it inherits from 
        * @return Typeoneerror_Acl       Reference to Acl class 
        */ 
        protected function _add($resource, $parent = null) 
        { 
         $this->add(new Zend_Acl_Resource($resource), $parent); 
    
         return $this; 
        } 
    
        /** 
        * Wrapper for <code>addRole</code> 
        * 
        * @param Zend_Acl_Resource_Interface $resource  The resource to add 
        * @param Zend_Acl_Resource_Interface|string $parents Parent resources it inherits from 
        * @return Typeoneerror_Acl       Reference to Acl class 
        */ 
        protected function _addRole($role, $parents = null) 
        { 
         $this->addRole(new Zend_Acl_Role($role, $parents)); 
    
         return $this; 
        } 
    
    } 
    

    Düzenleme

    Guess Ben de herhangi bir kaynak isteğinde bulunulduğunda kullanılan bir Typeoneerror_Controller_Plugin_Acl olduğunu açıklamalıdır. Burada istenen kaynağın "etiketini" oluşturup kullanıcının bu etikete erişip erişmediğini kontrol ediyorum:

    $controller = $request->controller; 
        $action = $request->action; 
        $module = (empty($request->module)) ? "default" : $request->module; 
    
        // -- this ends up like "cms:articles" just like my resources 
        $resource = $module . ":" . $controller; 
    
        if (!$this->__acl->has($resource)) 
        { 
         $resource = $module; 
        } 
    
        // -- the good stuff. check if the user's role can access the resource and action 
        if (!$this->__acl->isAllowed($role, $resource, $action)) 
        { 
         //more code 
        } 
    
    +0

    Örneğinizde Kullanıcı, Rol ve Kaynak düzeylerini görüyorum. Kullanıcı, Rol, Kaynak, Ayrıcalık var. Bir Kullanıcının bir Rolü vardır, Rolün birden çok Kaynağı olabilir ve bir Kaynak birden çok Ayrıcalıklara sahip olabilir. Çözümünüzde bir şeyi yanlış anladım mı? – Sonny

    +0

    Doğru hakkında sesler. Kullanıcıların kurulum şekli, her kullanıcı ebeveyninden ayrıcalıklar alır.Yani "admin" tüm "misafir" ve "üyeler" ayrıcalıklarını alır. Yönetici altında, "tümüne" izin veriyorum ve ardından tüm kaynaklarda "tasfiye" işlemini reddediyorum ve "oluştur" eylemini yalnızca "cms: yorumlar" kaynağında reddediyorum. Böylece "cms: comments-> view" veya "cms: comments-> moderate" eylemlerine hala erişebilirler. – typeoneerror

    +0

    Bazı kod eklendi. – typeoneerror

    İlgili konular