Роль ресурса ACL по умолчанию

8

Допустим, мы добавили некоторые новые ресурсы в 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вставки строк в таблицу. Но этот код, по-видимому, предполагает, что все ресурсы опубликованы, что означало бы, что для его непосредственного вызова мне нужно выяснить, в каком формате мне нужно передавать эти данные и, возможно, также загружать существующий ресурс.

Питер О'Каллаган
источник
Не уверен, что вы используете 'isAllowed' правильно - не так ли? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird
Для меня это похоже на ошибку
Фабиан Блехшмидт

Ответы:

2

Я не смог воссоздать проблему на 1.13.1.0. Я использовал ваш точный код, за исключением того, что я использовал его для условного изменения заголовка страницы. Сначала я проверил это с пользователем, вошедшим со всеми разрешениями, и метод isAllowed вернул true. Затем я создал другую роль, в которой не был установлен этот флажок, но были выбраны все остальные поля, а затем я вышел из системы и снова вошел в систему с пользователем, подключенным к этой новой роли, и isAllowed возвращал false. Вы можете попытаться выйти и снова войти в систему. Если это по-прежнему не работает, попробуйте очистить кэш и сеансы и снова войти в систему.

Джонатан Ходжес
источник
0

Значение по умолчанию в Mage_Admin_Model_Sessionдействительности false(не имеет смысла в противном случае):

public function isAllowed($resource, $privilege = null)
{
    $user = $this->getUser();
    $acl = $this->getAcl();

    if ($user && $acl) {
        if (!preg_match('/^admin/', $resource)) {
            $resource = 'admin/' . $resource;
        }

        try {
            return $acl->isAllowed($user->getAclRole(), $resource, $privilege);
        } catch (Exception $e) {
            try {
                if (!$acl->has($resource)) {
                    return $acl->isAllowed($user->getAclRole(), null, $privilege);
                }
            } catch (Exception $e) { }
        }
    }
    return false;
}

Но может случиться так, что для ролей были установлены разрешения catalog, т. Е. Вы выбрали не все одиночные дочерние элементы, а сам флажок каталога. Затем оно сохраняется как одно разрешение, которое учитывается для всех дочерних элементов ( catalog/*), даже если они добавляются позже.

Извините, это не было правдой. Каждое разрешение сохраняется отдельно дополнительный родителю.

Фабиан Шменглер
источник
Где логика, которая позволяет одно разрешение для учета всех детей?
Питер О'Каллаган
Я проверил еще раз и не смог найти его, похоже, что родительские ресурсы существуют только для того, чтобы вы могли проверить isAllowed('catalog')- он неявно разрешает доступ всем дочерним элементам. Извините за дезинформацию!
Фабиан Шменглер