2010-02-16 2 views
9

젠드 프레임 워크에 기반한 애플리케이션입니다. 나는 인증을 위해서 Zend_Auth을 사용하고 있지만, 솔직하게 말해서 내가 본 예가 나의 요구에 너무 단순하거나 나를 혼란스럽게하기 때문에 Zend_Acl이 나를 위해 작동하는지 확신 할 수 없다.Zend ACL이 내 요구 사항에 맞습니까?

저는 리소스로서 내 애플리케이션의 요소를 생각하고 있으며, 이러한 리소스는 권한을 가질 수 있습니다. 자원 권한을 포함하는 역할은 동적으로 사용자에게 할당되어 정의됩니다. 정규화 된 테이블에이 정보를 저장합니다.

  1. 사용자
  2. 자원 여러 권한

역할을 할 수있는 여러 자원을 가질 수있는 역할

  • 역할이없는 계층 구조와 자원 권한의 정말 모음입니다. Resource의 예는 'Page'입니다. 모든 사용자가 페이지를 볼 수 있지만 인증 된 사용자는 페이지를 사용하여 다른 작업을 수행하려면 '추가', '수정'또는 '삭제'권한이 필요합니다.

    젠드 ACL이있는 메쉬입니까? 나에게 ACL을 문제가되는 방식으로 생각하고 있는가?


    내 솔루션

    Typeonerror 신용을 얻을 수 있지만, 여기 내 특정 솔루션입니다.

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

    내가 resource, privilegerole_id 열을 반환하는 쿼리를 실행하여 ACL을 채우려면 : 만 현재 사용자의 역할을로드하기 때문에

    나는 내 사용을 단순화하기 위해 Zend_Acl을 확장했다. 사용자의 역할에 해당 권한이없는 경우 role_id 열은 결과 집합에서 null입니다.

    $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']); 
        } 
    } 
    
  • 답변

    10

    정확하게 작동하는 방식이며 정확한 방식으로 생각하고 있다고 생각합니다. 리소스를 추가 한 다음 특정 사용자 역할이 리소스에 액세스 할 수 있도록 권한을 추가 할 수 있습니다. 예를 들어 내 CMS에는 "개발자", "관리자"및 "사용자"가 있습니다. 아래 코드에서 일반 액세스를 추가 한 다음 특정 사용자의 액세스에서 일부 작업과 특정 메서드를 제거합니다. 물론 이것은 내 응용 프로그램에만 한정되어 있지만 기본적으로 auth-> getIdentity() (또는 유사)에서 사용자의 역할을 가져온 다음 데이터베이스에서 역할/자원을 추가해야합니다.

    <?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; 
        } 
    
    } 
    

    편집

    추측은 나 또한 내가 어떤 자원이 요청 될 때마다 사용되는 Typeoneerror_Controller_Plugin_Acl을 가지고 설명해야한다. 여기서는 요청한 리소스가 만드는 "태그"를 만들고 사용자가 해당 태그에 액세스 할 수 있는지 여부를 확인합니다.

    $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

    예에서 사용자, 역할 및 리소스의 수준이 표시됩니다. 나는 사용자, 역할, 자원, 특권을 가지고있다. 사용자에게는 하나의 역할이 있고 역할에는 여러 자원이 있고 자원에는 여러 권한이있을 수 있습니다. 내가 당신의 솔루션에서 뭔가를 오해하고 있습니까? – Sonny

    +0

    오른쪽에 대한 소리. 사용자가 설정되는 방식에 따라 각 사용자는 부모로부터 권한을 상속받습니다.따라서 "admin"은 "guest"및 "members"권한을 모두 갖습니다. admin에서 "all"을 허용 한 다음 모든 리소스에서 "제거"작업을 거부하고 "cms : comments"자원에서만 "create"작업을 거부합니다. 그래서 그들은 여전히 ​​"cms : comments-> view"또는 "cms : comments-> moderate"액션에 액세스 할 수 있습니다. – typeoneerror

    +0

    일부 코드가 추가되었습니다. – typeoneerror

    관련 문제