RoleSecurityHandlerTest.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. /*
  3. * This file is part of the Sonata Project package.
  4. *
  5. * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Sonata\AdminBundle\Tests\Security\Handler;
  11. use Sonata\AdminBundle\Admin\AdminInterface;
  12. use Sonata\AdminBundle\Security\Handler\RoleSecurityHandler;
  13. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  14. use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
  15. use Symfony\Component\Security\Core\SecurityContextInterface;
  16. /**
  17. * Test for RoleSecurityHandler.
  18. *
  19. * @author Andrej Hudec <pulzarraider@gmail.com>
  20. */
  21. class RoleSecurityHandlerTest extends \PHPUnit_Framework_TestCase
  22. {
  23. /**
  24. * @var AdminInterface
  25. */
  26. private $admin;
  27. /**
  28. * @var AuthorizationCheckerInterface|SecurityContextInterface
  29. */
  30. private $authorizationChecker;
  31. public function setUp()
  32. {
  33. // Set the SecurityContext for Symfony <2.6
  34. if (interface_exists('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface')) {
  35. $this->authorizationChecker = $this->getMock('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface');
  36. } else {
  37. $this->authorizationChecker = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
  38. }
  39. $this->admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  40. }
  41. /**
  42. * @dataProvider getBaseRoleTests
  43. */
  44. public function testGetBaseRole($expected, $code)
  45. {
  46. $handler = new RoleSecurityHandler($this->authorizationChecker, array('ROLE_BATMAN', 'ROLE_IRONMAN'));
  47. $this->admin->expects($this->once())
  48. ->method('getCode')
  49. ->will($this->returnValue($code));
  50. $this->assertSame($expected, $handler->getBaseRole($this->admin));
  51. }
  52. public function getBaseRoleTests()
  53. {
  54. return array(
  55. array('ROLE_FOO_BAR_%s', 'foo.bar'),
  56. array('ROLE_FOO_BAR_%s', 'Foo.Bar'),
  57. array('ROLE_FOO_BAR_BAZ_%s', 'foo.bar_baz'),
  58. array('ROLE_FOO_BAR_%s', 'FOO.BAR'),
  59. );
  60. }
  61. /**
  62. * @dataProvider getIsGrantedTests
  63. */
  64. public function testIsGranted($expected, array $superAdminRoles, $adminCode, $operation, $object = null)
  65. {
  66. $handler = $this->getRoleSecurityHandler($superAdminRoles);
  67. $this->admin->expects($this->any())
  68. ->method('getCode')
  69. ->will($this->returnValue($adminCode));
  70. $this->authorizationChecker->expects($this->any())
  71. ->method('isGranted')
  72. ->will($this->returnCallback(function (array $attributes, $object) {
  73. if (in_array('ROLE_BATMAN', $attributes)) {
  74. return true;
  75. }
  76. if (in_array('ROLE_IRONMAN', $attributes)) {
  77. return true;
  78. }
  79. if (in_array('ROLE_AUTH_EXCEPTION', $attributes)) {
  80. throw new AuthenticationCredentialsNotFoundException();
  81. }
  82. if (in_array('ROLE_FOO_BAR_ABC', $attributes)) {
  83. return true;
  84. }
  85. if (in_array('ROLE_FOO_BAR_DEF', $attributes) && is_a($object, 'stdClass')) {
  86. return true;
  87. }
  88. return false;
  89. }));
  90. $this->assertSame($expected, $handler->isGranted($this->admin, $operation, $object));
  91. }
  92. public function getIsGrantedTests()
  93. {
  94. return array(
  95. //empty
  96. array(false, array(''), 'foo.bar', ''),
  97. array(false, array(''), 'foo.bar', array('')),
  98. array(false, array(''), 'foo.bar.abc', array('')),
  99. array(false, array(''), 'foo.bar.def', array('')),
  100. array(false, array(''), 'foo.bar.baz.xyz', ''),
  101. array(false, array(''), 'foo.bar.baz.xyz', array('')),
  102. //superadmins
  103. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', 'BAZ'),
  104. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', 'ANYTHING'),
  105. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', array('BAZ', 'ANYTHING')),
  106. array(true, array('ROLE_IRONMAN'), 'foo.bar', 'BAZ'),
  107. array(true, array('ROLE_IRONMAN'), 'foo.bar', 'ANYTHING'),
  108. array(true, array('ROLE_IRONMAN'), 'foo.bar.baz.xyz', 'ANYTHING'),
  109. array(true, array('ROLE_IRONMAN'), 'foo.bar', ''),
  110. array(true, array('ROLE_IRONMAN'), 'foo.bar', array('')),
  111. //operations
  112. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'ABC'),
  113. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC')),
  114. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC', 'DEF')),
  115. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ', 'ABC')),
  116. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'DEF'),
  117. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', array('DEF')),
  118. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'BAZ'),
  119. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ')),
  120. array(true, array(), 'foo.bar', 'ABC'),
  121. array(true, array(), 'foo.bar', array('ABC')),
  122. array(false, array(), 'foo.bar', 'DEF'),
  123. array(false, array(), 'foo.bar', array('DEF')),
  124. array(false, array(), 'foo.bar', 'BAZ'),
  125. array(false, array(), 'foo.bar', array('BAZ')),
  126. array(false, array(), 'foo.bar.baz.xyz', 'ABC'),
  127. array(false, array(), 'foo.bar.baz.xyz', array('ABC')),
  128. array(false, array(), 'foo.bar.baz.xyz', array('ABC', 'DEF')),
  129. array(false, array(), 'foo.bar.baz.xyz', 'DEF'),
  130. array(false, array(), 'foo.bar.baz.xyz', array('DEF')),
  131. array(false, array(), 'foo.bar.baz.xyz', 'BAZ'),
  132. array(false, array(), 'foo.bar.baz.xyz', array('BAZ')),
  133. //objects
  134. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('DEF'), new \stdClass()),
  135. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC'), new \stdClass()),
  136. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC', 'DEF'), new \stdClass()),
  137. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ', 'DEF'), new \stdClass()),
  138. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'DEF', new \stdClass()),
  139. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'ABC', new \stdClass()),
  140. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'BAZ', new \stdClass()),
  141. array(false, array('ROLE_SPIDERMAN'), 'foo.bar.baz.xyz', 'DEF', new \stdClass()),
  142. array(false, array('ROLE_SPIDERMAN'), 'foo.bar.baz.xyz', 'ABC', new \stdClass()),
  143. array(true, array(), 'foo.bar', array('ABC'), new \stdClass()),
  144. array(true, array(), 'foo.bar', 'ABC', new \stdClass()),
  145. array(true, array(), 'foo.bar', array('DEF'), new \stdClass()),
  146. array(true, array(), 'foo.bar', 'DEF', new \stdClass()),
  147. array(false, array(), 'foo.bar', array('BAZ'), new \stdClass()),
  148. array(false, array(), 'foo.bar', 'BAZ', new \stdClass()),
  149. array(false, array(), 'foo.bar.baz.xyz', 'BAZ', new \stdClass()),
  150. array(false, array(), 'foo.bar.baz.xyz', array('BAZ'), new \stdClass()),
  151. array(false, array('ROLE_AUTH_EXCEPTION'), 'foo.bar.baz.xyz', array('BAZ'), new \stdClass()),
  152. );
  153. }
  154. public function testIsGrantedWithException()
  155. {
  156. $this->setExpectedException('RuntimeException', 'Something is wrong');
  157. $this->admin->expects($this->any())
  158. ->method('getCode')
  159. ->will($this->returnValue('foo.bar'));
  160. $this->authorizationChecker->expects($this->any())
  161. ->method('isGranted')
  162. ->will($this->returnCallback(function (array $attributes, $object) {
  163. throw new \RuntimeException('Something is wrong');
  164. }));
  165. $handler = $this->getRoleSecurityHandler(array('ROLE_BATMAN'));
  166. $handler->isGranted($this->admin, 'BAZ');
  167. }
  168. public function testCreateObjectSecurity()
  169. {
  170. $handler = $this->getRoleSecurityHandler(array('ROLE_FOO'));
  171. $this->assertNull($handler->createObjectSecurity($this->getSonataAdminObject(), new \stdClass()));
  172. }
  173. public function testDeleteObjectSecurity()
  174. {
  175. $handler = $this->getRoleSecurityHandler(array('ROLE_FOO'));
  176. $this->assertNull($handler->deleteObjectSecurity($this->getSonataAdminObject(), new \stdClass()));
  177. }
  178. public function testBuildSecurityInformation()
  179. {
  180. $handler = $this->getRoleSecurityHandler(array('ROLE_FOO'));
  181. $this->assertSame(array(), $handler->buildSecurityInformation($this->getSonataAdminObject()));
  182. }
  183. /**
  184. * @return RoleSecurityHandler
  185. */
  186. private function getRoleSecurityHandler(array $superAdminRoles)
  187. {
  188. return new RoleSecurityHandler($this->authorizationChecker, $superAdminRoles);
  189. }
  190. /**
  191. * @return AdminInterface
  192. */
  193. private function getSonataAdminObject()
  194. {
  195. return $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  196. }
  197. }