瀏覽代碼

ZF-1721, ZF-1722
- Solution for inheritence and assetions, both issues
- Fixed text case to return proper use case Acl object

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17317 44c647ce-9c0f-0410-b52a-842ac1e357ba

ralph 16 年之前
父節點
當前提交
22fd9e9d30
共有 2 個文件被更改,包括 41 次插入11 次删除
  1. 35 2
      library/Zend/Acl.php
  2. 6 9
      tests/Zend/Acl/AclTest.php

+ 35 - 2
library/Zend/Acl.php

@@ -81,6 +81,16 @@ class Zend_Acl
     protected $_resources = array();
 
     /**
+     * @var Zend_Acl_Role_Interface
+     */
+    protected $_isAllowedRole     = null;
+    
+    /**
+     * @var Zend_Acl_Resource_Interface
+     */
+    protected $_isAllowedResource = null;
+    
+    /**
      * ACL rules; whitelist (deny everything to all) by default
      *
      * @var array
@@ -683,12 +693,25 @@ class Zend_Acl
      */
     public function isAllowed($role = null, $resource = null, $privilege = null)
     {
+    	// reset role & resource to null
+    	$this->_isAllowedRole = $this->_isAllowedResource = null;
+    	
         if (null !== $role) {
+        	// keep track of originally called role
+        	$this->_isAllowedRole = $role;
             $role = $this->_getRoleRegistry()->get($role);
+            if (!$this->_isAllowedRole instanceof Zend_Acl_Role_Interface) {
+            	$this->_isAllowedRole = $role;
+            }
         }
 
         if (null !== $resource) {
+        	// keep track of originally called resource
+        	$this->_isAllowedResource = $resource;
             $resource = $this->get($resource);
+            if (!$this->_isAllowedResource instanceof Zend_Acl_Resource_Interface) {
+            	$this->_isAllowedResource = $resource;
+            }
         }
 
         if (null === $privilege) {
@@ -964,8 +987,18 @@ class Zend_Acl
             $rule = $rules['byPrivilegeId'][$privilege];
         }
 
-        // check assertion if necessary
-        if (null === $rule['assert'] || $rule['assert']->assert($this, $role, $resource, $privilege)) {
+        // check assertion first
+        if ($rule['assert']) {
+            $assertion = $rule['assert'];
+            $assertionValue = $assertion->assert(
+                $this,
+                ($this->_isAllowedRole instanceof Zend_Acl_Role_Interface) ? $this->_isAllowedRole : $role,
+                ($this->_isAllowedResource instanceof Zend_Acl_Resource_Interface) ? $this->_isAllowedResource : $resource,
+                $privilege
+                );
+        } 
+        
+        if (null === $rule['assert'] || $assertionValue) {
             return $rule['type'];
         } else if (null !== $resource || null !== $role || null !== $privilege) {
             return null;

+ 6 - 9
tests/Zend/Acl/AclTest.php

@@ -1152,15 +1152,12 @@ class Zend_Acl_AclTest extends PHPUnit_Framework_TestCase
      */
     protected function _loadUseCase1()
     {
-    	if (class_exists('Zend_Acl_UseCase1_User')) {
-    		return;
-    	}
-    	
-    	require_once dirname(__FILE__) . '/_files/UseCase1/User.php';
-    	require_once dirname(__FILE__) . '/_files/UseCase1/BlogPost.php';
-    	require_once dirname(__FILE__) . '/_files/UseCase1/UserIsBlogPostOwnerAssertion.php';
-    	require_once dirname(__FILE__) . '/_files/UseCase1/Acl.php';
-    	
+    	if (!class_exists('Zend_Acl_UseCase1_Acl')) {
+	    	require_once dirname(__FILE__) . '/_files/UseCase1/User.php';
+	    	require_once dirname(__FILE__) . '/_files/UseCase1/BlogPost.php';
+	    	require_once dirname(__FILE__) . '/_files/UseCase1/UserIsBlogPostOwnerAssertion.php';
+	    	require_once dirname(__FILE__) . '/_files/UseCase1/Acl.php';
+    	}    	
     	return new Zend_Acl_UseCase1_Acl();
     }