소스 검색

[Security/Acl] fixes #853

Johannes Schmitt 14 년 전
부모
커밋
48dc85dc43

+ 4 - 0
src/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php

@@ -246,6 +246,10 @@ class MutableAclProvider extends AclProvider implements MutableAclProviderInterf
                 }
 
                 $this->regenerateAncestorRelations($acl);
+                $childAcls = $this->findAcls($this->findChildren($acl->getObjectIdentity(), false));
+                foreach ($childAcls as $childOid) {
+                    $this->regenerateAncestorRelations($childAcls[$childOid]);
+                }
             }
 
             // this includes only updates of existing ACEs, but neither the creation, nor

+ 22 - 0
tests/Symfony/Tests/Component/Security/Acl/Dbal/MutableAclProviderTest.php

@@ -337,6 +337,28 @@ class MutableAclProviderTest extends \PHPUnit_Framework_TestCase
         $this->assertSame($parentAcl->getId(), $reloadedAcl->getParentAcl()->getId());
     }
 
+    public function testUpdateAclUpdatesChildAclsCorrectly()
+    {
+        $provider = $this->getProvider();
+        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
+
+        $parentAcl = $provider->createAcl(new ObjectIdentity(1, 'Bar'));
+        $acl->setParentAcl($parentAcl);
+        $provider->updateAcl($acl);
+
+        $parentParentAcl = $provider->createAcl(new ObjectIdentity(1, 'Baz'));
+        $parentAcl->setParentAcl($parentParentAcl);
+        $provider->updateAcl($parentAcl);
+
+        $newParentParentAcl = $provider->createAcl(new ObjectIdentity(2, 'Baz'));
+        $parentAcl->setParentAcl($newParentParentAcl);
+        $provider->updateAcl($parentAcl);
+
+        $reloadProvider = $this->getProvider();
+        $reloadedAcl = $reloadProvider->findAcl(new ObjectIdentity(1, 'Foo'));
+        $this->assertEquals($newParentParentAcl->getId(), $reloadedAcl->getParentAcl()->getParentAcl()->getId());
+    }
+
     /**
      * Data must have the following format:
      * array(