Допустим, мы добавили некоторые новые ресурсы в ACL следующим образом:
<acl>
<resources>
<admin>
<children>
<catalog>
<children>
<search>
<children>
<import translate="title">
<title>Import</title>
</import>
<export translate="title">
<title>Export</title>
</export>
</children>
</search>
</children>
</catalog>
</children>
</admin>
</resources>
</acl>
Затем мы добавляем следующее вокруг кнопки, которая появляется в сетке SearchTerm:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Если бы я вошел в систему как пользователь без прав администратора, я бы действительно подумал, что ожидаемое поведение не будет отображаться кнопкой, так как я явно не назначил пользователям роль ресурса. Однако оказывается, что возвращаемое значение по умолчанию isAllowed
для true. В дополнение к этому, когда вы идете и просматриваете ресурсы для этой роли, флажок не будет отмечен галочкой.
Я могу решить «проблему», щелкнув по каждой роли и нажав «Сохранить», но это PITA, особенно для среды live / stage / dev. Есть ли простой способ автоматического запрета этого ресурса для каждой роли через код? Я не против добавить скрипт миграции, если это необходимо. Я быстро взглянул на то, что происходит в том же действии. Предположительно, я мог бы сделать это, загрузив все роли, просматривая их и выполняя аналогичную логику для Mage_Admin_Model_Resource_Rules::saveRel
вставки строк в таблицу. Но этот код, по-видимому, предполагает, что все ресурсы опубликованы, что означало бы, что для его непосредственного вызова мне нужно выяснить, в каком формате мне нужно передавать эти данные и, возможно, также загружать существующий ресурс.
источник
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Ответы:
Я не смог воссоздать проблему на 1.13.1.0. Я использовал ваш точный код, за исключением того, что я использовал его для условного изменения заголовка страницы. Сначала я проверил это с пользователем, вошедшим со всеми разрешениями, и метод isAllowed вернул true. Затем я создал другую роль, в которой не был установлен этот флажок, но были выбраны все остальные поля, а затем я вышел из системы и снова вошел в систему с пользователем, подключенным к этой новой роли, и isAllowed возвращал false. Вы можете попытаться выйти и снова войти в систему. Если это по-прежнему не работает, попробуйте очистить кэш и сеансы и снова войти в систему.
источник
Значение по умолчанию в
Mage_Admin_Model_Session
действительностиfalse
(не имеет смысла в противном случае):Но может случиться так, что для ролей были установлены разрешенияcatalog
, т. Е. Вы выбрали не все одиночные дочерние элементы, а сам флажок каталога. Затем оно сохраняется как одно разрешение, которое учитывается для всех дочерних элементов (catalog/*
), даже если они добавляются позже.Извините, это не было правдой. Каждое разрешение сохраняется отдельно дополнительный родителю.
источник
isAllowed('catalog')
- он неявно разрешает доступ всем дочерним элементам. Извините за дезинформацию!