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,尤其是在现场/舞台/开发环境中。有没有简单的方法可以通过代码自动拒绝每个角色的资源?如果需要,我不介意添加迁移脚本。我快速查看了同一动作会发生什么。大概可以做到这一点,方法是加载所有角色,循环遍历所有角色,并执行类似的逻辑以Mage_Admin_Model_Resource_Rules::saveRel将行插入表中。但是这段代码似乎假定所有资源都已发布,这意味着要直接调用它,我需要确定需要哪种格式将数据传递给它并可能加载现有资源。


不确定您是否正确使用了“ isAllowed”-不是吗?$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird 2013年

对我来说似乎是个小虫
Fabian Blechschmidt 2014年

Answers:


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')-它并不隐式允许访问所有子级。对不起,误导信息!
Fabian Schmengler,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.