SecurityExtensionTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
  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 Symfony\Bundle\SecurityBundle\Tests\DependencyInjection;
  11. use Symfony\Component\DependencyInjection\Reference;
  12. use Symfony\Component\DependencyInjection\Parameter;
  13. use Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension;
  14. use Symfony\Component\DependencyInjection\ContainerBuilder;
  15. abstract class SecurityExtensionTest extends \PHPUnit_Framework_TestCase
  16. {
  17. abstract protected function loadFromFile(ContainerBuilder $container, $file);
  18. public function testRolesHierarchy()
  19. {
  20. $container = $this->getContainer('container1');
  21. $this->assertEquals(array(
  22. 'ROLE_ADMIN' => array('ROLE_USER'),
  23. 'ROLE_SUPER_ADMIN' => array('ROLE_USER', 'ROLE_ADMIN', 'ROLE_ALLOWED_TO_SWITCH'),
  24. 'ROLE_REMOTE' => array('ROLE_USER', 'ROLE_ADMIN'),
  25. ), $container->getParameter('security.role_hierarchy.roles'));
  26. }
  27. public function testUserProviders()
  28. {
  29. $container = $this->getContainer('container1');
  30. $providers = array_values(array_filter($container->getServiceIds(), function ($key) { return 0 === strpos($key, 'security.user.provider.concrete'); }));
  31. $expectedProviders = array(
  32. 'security.user.provider.concrete.default',
  33. 'security.user.provider.concrete.default_foo',
  34. 'security.user.provider.concrete.digest',
  35. 'security.user.provider.concrete.digest_foo',
  36. 'security.user.provider.concrete.basic',
  37. 'security.user.provider.concrete.basic_foo',
  38. 'security.user.provider.concrete.basic_bar',
  39. 'security.user.provider.concrete.doctrine',
  40. 'security.user.provider.concrete.service',
  41. 'security.user.provider.concrete.chain',
  42. );
  43. $this->assertEquals(array(), array_diff($expectedProviders, $providers));
  44. $this->assertEquals(array(), array_diff($providers, $expectedProviders));
  45. // chain provider
  46. $this->assertEquals(array(array(
  47. new Reference('security.user.provider.concrete.service'),
  48. new Reference('security.user.provider.concrete.doctrine'),
  49. new Reference('security.user.provider.concrete.basic'),
  50. )), $container->getDefinition('security.user.provider.concrete.chain')->getArguments());
  51. }
  52. public function testFirewalls()
  53. {
  54. $container = $this->getContainer('container1');
  55. $arguments = $container->getDefinition('security.firewall.map')->getArguments();
  56. $listeners = array();
  57. foreach (array_keys($arguments[1]) as $contextId) {
  58. $contextDef = $container->getDefinition($contextId);
  59. $arguments = $contextDef->getArguments();
  60. $listeners[] = array_map(function ($ref) { return (string) $ref; }, $arguments['index_0']);
  61. }
  62. $this->assertEquals(array(
  63. array(),
  64. array(
  65. 'security.channel_listener',
  66. 'security.logout_listener.secure',
  67. 'security.authentication.listener.x509.secure',
  68. 'security.authentication.listener.form.secure',
  69. 'security.authentication.listener.basic.secure',
  70. 'security.authentication.listener.digest.secure',
  71. 'security.authentication.listener.anonymous',
  72. 'security.access_listener',
  73. 'security.authentication.switchuser_listener.secure',
  74. ),
  75. ), $listeners);
  76. }
  77. public function testAccess()
  78. {
  79. $container = $this->getContainer('container1');
  80. $rules = array();
  81. foreach ($container->getDefinition('security.access_map')->getMethodCalls() as $call) {
  82. if ($call[0] == 'add') {
  83. $rules[] = array((string) $call[1][0], $call[1][1], $call[1][2]);
  84. }
  85. }
  86. $matcherIds = array();
  87. foreach ($rules as $rule) {
  88. list($matcherId, $roles, $channel) = $rule;
  89. $this->assertFalse(isset($matcherIds[$matcherId]));
  90. $matcherIds[$matcherId] = true;
  91. $i = count($matcherIds);
  92. if (1 === $i) {
  93. $this->assertEquals(array('ROLE_USER'), $roles);
  94. $this->assertEquals('https', $channel);
  95. } else if (2 === $i) {
  96. $this->assertEquals(array('IS_AUTHENTICATED_ANONYMOUSLY'), $roles);
  97. $this->assertNull($channel);
  98. }
  99. }
  100. }
  101. public function testMerge()
  102. {
  103. $container = $this->getContainer('merge');
  104. $this->assertEquals(array(
  105. 'FOO' => array('MOO'),
  106. 'ADMIN' => array('USER'),
  107. ), $container->getParameter('security.role_hierarchy.roles'));
  108. }
  109. public function testEncoders()
  110. {
  111. $container = $this->getContainer('container1');
  112. $this->assertEquals(array(array(
  113. 'JMS\FooBundle\Entity\User1' => array(
  114. 'class' => new Parameter('security.encoder.plain.class'),
  115. 'arguments' => array(false),
  116. ),
  117. 'JMS\FooBundle\Entity\User2' => array(
  118. 'class' => new Parameter('security.encoder.digest.class'),
  119. 'arguments' => array('sha1', false, 5),
  120. ),
  121. 'JMS\FooBundle\Entity\User3' => array(
  122. 'class' => new Parameter('security.encoder.digest.class'),
  123. 'arguments' => array('md5', true, 5000),
  124. ),
  125. 'JMS\FooBundle\Entity\User4' => new Reference('security.encoder.foo'),
  126. )), $container->getDefinition('security.encoder_factory.generic')->getArguments());
  127. }
  128. protected function getContainer($file)
  129. {
  130. $container = new ContainerBuilder();
  131. $security = new SecurityExtension();
  132. $container->registerExtension($security);
  133. $this->loadFromFile($container, $file);
  134. $container->getCompilerPassConfig()->setOptimizationPasses(array());
  135. $container->getCompilerPassConfig()->setRemovingPasses(array());
  136. $container->compile();
  137. return $container;
  138. }
  139. }