Magento自定义ACL默认返回TRUE

问题描述 投票:2回答:2

我在Manage Customer中为一个选项卡定义了一个acl

    <acl>
        <resources>
            <all>
                <title>Allow Everything</title>
            </all>
            <admin>
                <children>
                    <customer>
                        <children>
                            <manage>
                                <children>
                                    <managepoint translate="title">
                                        <title>Manage Point</title>
                                        <sort_order>100</sort_order>
                                    </managepoint>
                                </children>
                            </manage>
                        </children>
                    </customer>
                </children>
            </admin>
        </resources>
    </acl>

使用此代码

public function canShowTab(){
    if(!Mage::getSingleton('admin/session')->isAllowed('customer/manage/managepoint'))
        return false;
    return true;
}

默认情况下,除了管理员角色Mage :: getSingleton('admin / session') - > isAllowed('customer / manage / managepoint')之外的任何用户角色下的所有用户都应该返回FALSE,但实际上它返回TRUE,但是如果我检查然后取消选中此ACL以获取相关角色,然后ACL按预期开始工作。

任何人都可以告诉我为什么Mage :: getSingleton('admin / session') - > isAllowed('customer / manage / managepoint')默认返回FALSE。

php magento magento-1.7 acl
2个回答
5
投票

花了很多时间,但经过适当的测试后,我得出了关于Magento ACL行为的结论。

Mangento使用权限拒绝/允许将角色资源存储在admin_role表中。因此,每当我们创建新角色时,该资源都没有条目输入admin_role中的任何角色,isAllowed默认情况下将返回TRUE值。但是此后如果我们创建新角色并且未选中我们的自定义ACL,则admin_role会以“拒绝”权限保存条目。所以isAllowed将起作用。因此,在创建新ACL之后,我们必须转到每个角色并保存这些角色一次或转到admin_role表并提供所有role_id的条目


0
投票

这本身并不是解决方案,而且我发现这一点特别烦人。 所以这是一种方法,如果你有很多角色,并且你想快速添加拒绝,你可以运行这个SQL命令

-- Add roles to DENY
INSERT INTO admin_rule
SELECT null, role_id, 'admin/path/to/your/acl', null, 0, 'G', 'deny'  FROM admin_role WHERE user_id = 0 AND role_id NOT IN (1, 20);

-- Add roles to ALLOW
INSERT INTO admin_rule
SELECT null, role_id, 'admin/path/to/your/acl', null, 0, 'G', 'allow'  FROM admin_role WHERE user_id = 0 AND role_id IN (1, 20);

此脚本可以与代码同时发送。

© www.soinside.com 2019 - 2024. All rights reserved.