AdminAclManipulator.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. /*
  3. * This file is part of the Sonata 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\Util;
  11. use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
  12. use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
  13. use Symfony\Component\Security\Acl\Model\AclInterface;
  14. use Symfony\Component\Console\Output\OutputInterface;
  15. use Sonata\AdminBundle\Admin\AdminInterface;
  16. use Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface;
  17. class AdminAclManipulator implements AdminAclManipulatorInterface
  18. {
  19. protected $securityHandler;
  20. protected $maskBuilderClass;
  21. public function __construct(AclSecurityHandlerInterface $securityHandler, $maskBuilderClass)
  22. {
  23. $this->securityHandler = $securityHandler;
  24. $this->maskBuilderClass =$maskBuilderClass;
  25. }
  26. /**
  27. * {@inheritDoc}
  28. */
  29. public function configureAcls(OutputInterface $output, AdminInterface $admin)
  30. {
  31. $securityHandler = $admin->getSecurityHandler();
  32. if (!$securityHandler instanceof AclSecurityHandlerInterface) {
  33. $output->writeln('Admin class is not configured to use ACL : <info>ignoring</info>');
  34. return;
  35. }
  36. $objectIdentity = ObjectIdentity::fromDomainObject($admin);
  37. $newAcl = false;
  38. if (is_null($acl = $this->securityHandler->getObjectAcl($objectIdentity))) {
  39. $acl = $this->securityHandler->createAcl($objectIdentity);
  40. $newAcl = true;
  41. }
  42. // create admin ACL
  43. $output->writeln(sprintf(' > install ACL for %s', $admin->getCode()));
  44. $configResult = $this->addAdminClassAces($output, $acl, $securityHandler->buildSecurityInformation($admin));
  45. if ($configResult) {
  46. $this->securityHandler->updateAcl($acl);
  47. } else {
  48. $output->writeln(sprintf(' - %s , no roles and permissions found', ($newAcl ? 'skip' : 'removed')));
  49. $this->securityHandler->deleteAcl($objectIdentity);
  50. }
  51. }
  52. /**
  53. * {@inheritDoc}
  54. */
  55. public function addAdminClassAces(OutputInterface $output, AclInterface $acl, array $roleInformation = array())
  56. {
  57. if (count($this->securityHandler->getAdminPermissions()) > 0 ) {
  58. $builder = new $this->maskBuilderClass();
  59. foreach ($roleInformation as $role => $permissions) {
  60. $aceIndex = $this->securityHandler->findClassAceIndexByRole($acl, $role);
  61. $roleAdminPermissions = array();
  62. foreach ($permissions as $permission) {
  63. // add only the admin permissions
  64. if (in_array($permission, $this->securityHandler->getAdminPermissions())) {
  65. $builder->add($permission);
  66. $roleAdminPermissions[] = $permission;
  67. }
  68. }
  69. if (count($roleAdminPermissions) > 0) {
  70. if ($aceIndex === false) {
  71. $acl->insertClassAce(new RoleSecurityIdentity($role), $builder->get());
  72. $action = 'add';
  73. } else {
  74. $acl->updateClassAce($aceIndex, $builder->get());
  75. $action = 'update';
  76. }
  77. if (!is_null($output)) {
  78. $output->writeln(sprintf(' - %s role: %s, permissions: %s', $action, $role, json_encode($roleAdminPermissions)));
  79. }
  80. $builder->reset();
  81. } elseif ($aceIndex !== false) {
  82. $acl->deleteClassAce($aceIndex);
  83. if (!is_null($output)) {
  84. $output->writeln(sprintf(' - remove role: %s', $action, $role));
  85. }
  86. }
  87. }
  88. return true;
  89. } else {
  90. return false;
  91. }
  92. }
  93. }