Роль ресурса 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')- он неявно разрешает доступ всем дочерним элементам. Извините за дезинформацию!
Фабиан Шменглер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.