Rule.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Authorization\Model\Acl\Loader;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Framework\Serialize\Serializer\Json;
  9. class Rule implements \Magento\Framework\Acl\LoaderInterface
  10. {
  11. /**
  12. * Rules array cache key
  13. */
  14. const ACL_RULE_CACHE_KEY = 'authorization_rule_cached_data';
  15. /**
  16. * @var \Magento\Framework\App\ResourceConnection
  17. */
  18. protected $_resource;
  19. /**
  20. * @var \Magento\Framework\Acl\RootResource
  21. */
  22. private $_rootResource;
  23. /**
  24. * @var \Magento\Framework\Acl\Data\CacheInterface
  25. */
  26. private $aclDataCache;
  27. /**
  28. * @var Json
  29. */
  30. private $serializer;
  31. /**
  32. * @var string
  33. */
  34. private $cacheKey;
  35. /**
  36. * @param \Magento\Framework\Acl\RootResource $rootResource
  37. * @param \Magento\Framework\App\ResourceConnection $resource
  38. * @param array $data
  39. * @param \Magento\Framework\Acl\Data\CacheInterface $aclDataCache
  40. * @param Json $serializer
  41. * @param string $cacheKey
  42. * @SuppressWarnings(PHPMD.UnusedFormalParameter):
  43. */
  44. public function __construct(
  45. \Magento\Framework\Acl\RootResource $rootResource,
  46. \Magento\Framework\App\ResourceConnection $resource,
  47. array $data = [],
  48. \Magento\Framework\Acl\Data\CacheInterface $aclDataCache = null,
  49. Json $serializer = null,
  50. $cacheKey = self::ACL_RULE_CACHE_KEY
  51. ) {
  52. $this->_resource = $resource;
  53. $this->_rootResource = $rootResource;
  54. $this->aclDataCache = $aclDataCache ?: ObjectManager::getInstance()->get(
  55. \Magento\Framework\Acl\Data\CacheInterface::class
  56. );
  57. $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
  58. $this->cacheKey = $cacheKey;
  59. }
  60. /**
  61. * Populate ACL with rules from external storage
  62. *
  63. * @param \Magento\Framework\Acl $acl
  64. * @return void
  65. */
  66. public function populateAcl(\Magento\Framework\Acl $acl)
  67. {
  68. foreach ($this->getRulesArray() as $rule) {
  69. $role = $rule['role_id'];
  70. $resource = $rule['resource_id'];
  71. $privileges = !empty($rule['privileges']) ? explode(',', $rule['privileges']) : null;
  72. if ($acl->has($resource)) {
  73. if ($rule['permission'] == 'allow') {
  74. if ($resource === $this->_rootResource->getId()) {
  75. $acl->allow($role, null, $privileges);
  76. }
  77. $acl->allow($role, $resource, $privileges);
  78. } elseif ($rule['permission'] == 'deny') {
  79. $acl->deny($role, $resource, $privileges);
  80. }
  81. }
  82. }
  83. }
  84. /**
  85. * Get application ACL rules array.
  86. *
  87. * @return array
  88. */
  89. private function getRulesArray()
  90. {
  91. $rulesCachedData = $this->aclDataCache->load($this->cacheKey);
  92. if ($rulesCachedData) {
  93. return $this->serializer->unserialize($rulesCachedData);
  94. }
  95. $ruleTable = $this->_resource->getTableName("authorization_rule");
  96. $connection = $this->_resource->getConnection();
  97. $select = $connection->select()
  98. ->from(['r' => $ruleTable]);
  99. $rulesArr = $connection->fetchAll($select);
  100. $this->aclDataCache->save($this->serializer->serialize($rulesArr), $this->cacheKey);
  101. return $rulesArr;
  102. }
  103. }