_resource = $resource; $this->_rootResource = $rootResource; $this->aclDataCache = $aclDataCache ?: ObjectManager::getInstance()->get( \Magento\Framework\Acl\Data\CacheInterface::class ); $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class); $this->cacheKey = $cacheKey; } /** * Populate ACL with rules from external storage * * @param \Magento\Framework\Acl $acl * @return void */ public function populateAcl(\Magento\Framework\Acl $acl) { foreach ($this->getRulesArray() as $rule) { $role = $rule['role_id']; $resource = $rule['resource_id']; $privileges = !empty($rule['privileges']) ? explode(',', $rule['privileges']) : null; if ($acl->has($resource)) { if ($rule['permission'] == 'allow') { if ($resource === $this->_rootResource->getId()) { $acl->allow($role, null, $privileges); } $acl->allow($role, $resource, $privileges); } elseif ($rule['permission'] == 'deny') { $acl->deny($role, $resource, $privileges); } } } } /** * Get application ACL rules array. * * @return array */ private function getRulesArray() { $rulesCachedData = $this->aclDataCache->load($this->cacheKey); if ($rulesCachedData) { return $this->serializer->unserialize($rulesCachedData); } $ruleTable = $this->_resource->getTableName("authorization_rule"); $connection = $this->_resource->getConnection(); $select = $connection->select() ->from(['r' => $ruleTable]); $rulesArr = $connection->fetchAll($select); $this->aclDataCache->save($this->serializer->serialize($rulesArr), $this->cacheKey); return $rulesArr; } }