我已为“管理客户”中的标签定义了一个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') - &gt; isAllowed('customer / manage / managepoint')应返回FALSE,但实际上它返回是的,但如果我检查然后取消选中此ACL以获取特定的角色,那么ACL将按预期开始工作。
有人可以告诉我为什么Mage :: getSingleton('admin / session') - &gt; isAllowed('customer / manage / managepoint')默认返回FALSE。
答案 0 :(得分:5)
花了很多时间,经过适当的测试后,我得出了关于Magento ACL行为的结论。
Mangento使用权限拒绝/允许将角色资源存储在admin_role表中。因此,每当我们创建新角色时,该资源都没有条目输入admin_role中的任何角色,isAllowed默认情况下将返回TRUE值。但是此后如果我们创建新角色并且未选中我们的自定义ACL,则admin_role会以“拒绝”权限保存条目。所以isAllowed将起作用。 因此,在创建新ACL之后,我们必须转到每个角色并保存这些角色一次或转到admin_role表并提供所有role_id的条目
答案 1 :(得分: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);
此脚本可以与您的代码同时发送。