5

I've defined a custom menu item for the Magento admin interface with several sub items.

This works quite well as expected when a user with an admin role is logged into the admin interface. The admin sees all the sub items and can also access the pages the items link to. Each of these pages shows the content of a database table in a grid.

But the problems occur when I try to use a custom role. The custom role has access to the menu item and its sub items. Now, when I log into the admin interface with an user with this custom role the user sees all the menu items as expected, but for two sub items the user gets an access denied message when he clicks on the sub item.

Here is the acl and menu entry from the config.xml.

...
    <adminhtml>
        <acl>
            <resources>
                <admin>
                    <children>                      
                        <deliveryservice translate="title">
                            <title>Deliveryservice</title>
                            <sort_order>300</sort_order>
                            <children>
                                <holiday translate="title" module="deliveryservice">
                                    <title>Holidays</title>
                                    <sort_order>5</sort_order>
                                </holiday>
                                <holidayset translate="title" module="deliveryservice">
                                    <title>Holidaysets</title>
                                    <sort_order>10</sort_order>
                                </holidayset>
                                <openinghour translate="title" module="deliveryservice">
                                    <title>Openinghours</title>
                                    <sort_order>20</sort_order>
                                </openinghour>
                                <delivery_address translate="title" module="deliveryservice">
                                    <title>Delivery Areas</title>
                                    <sort_order>30</sort_order>
                                </delivery_address>
                                <minimum_order_value translate="title" module="deliveryservice">
                                    <title>Minimum order value</title>
                                    <sort_order>40</sort_order>
                                </minimum_order_value>
                                <key_value_store  translate="title" module="deliveryservice">
                                    <title>Key Value Store</title>
                                    <sort_order>50</sort_order>
                                </key_value_store>
                                 <ratings  translate="title" module="deliveryservice">
                                    <title>Bewertungen</title>
                                    <sort_order>60</sort_order>
                                </ratings>
                            </children>
                        </deliveryservice>
                    </children>
                </admin>
            </resources>
        </acl>
        <menu>
            <deliveryservice translate="title">
                <title>Deliveryservice</title>
                <sort_order>300</sort_order>
                <children>
                    <holiday translate="title" module="deliveryservice">
                        <title>Holidays</title>
                        <sort_order>5</sort_order>
                        <action>adminhtml/holiday/</action>
                    </holiday>
                    <holidayset translate="title" module="deliveryservice">
                        <title>Holidaysets</title>
                        <sort_order>10</sort_order>
                        <action>adminhtml/holidayset/</action>
                    </holidayset>
                    <openinghour translate="title" module="deliveryservice">
                        <title>Openinghours</title>
                        <sort_order>20</sort_order>
                        <action>adminhtml/openinghour/</action>
                    </openinghour>
                    <delivery_address translate="title" module="deliveryservice">
                        <title>Delivery Areas</title>
                        <sort_order>30</sort_order>
                        <action>adminhtml/deliveryaddress/</action>
                    </delivery_address>
                    <minimum_order_value translate="title" module="deliveryservice">
                        <title>Minimum Order Values</title>
                        <sort_order>40</sort_order>
                        <action>adminhtml/minimumordervalue/</action>
                    </minimum_order_value>
                    <key_value_store  translate="title" module="deliveryservice">
                        <title>Key Value Store</title>
                        <sort_order>50</sort_order>
                        <action>adminhtml/keyvaluestore/</action>
                    </key_value_store>
                    <ratings  translate="title" module="deliveryservice">
                        <title>Bewertungen</title>
                        <sort_order>60</sort_order>
                        <action>adminhtml/ratings/</action>
                    </ratings>
                </children>
            </deliveryservice>
        </menu>
    </adminhtml>
      ...

The problem occurs for the menu items minimum_order_value and key_value_store.

I don't understand why an admin can access all pages but a different role can not. Any ideas what might the problem here?

4

2 に答える 2

12

わかりました、問題を解決しました。

これは、サブメニュー項目とサブメニュー項目タグの名前に関連付けられたコントローラークラスに関連していました。

各コントローラーには_isAllowed()、ページを表示するためのユーザーの許可を確認するためのメソッドがあります。

例えば

protected function _isAllowed(){
    return Mage::getSingleton('admin/session')->isAllowed('deliveryservice/holidayset');
}

このメソッドでは、isAllowed()メソッドの呼び出しに使用されるパラメーターの最後の部分(スラッシュの後ろ)は、config.xmlのaclおよびメニューエントリのサブメニュー項目のタグの名前と同じである必要があります。

したがって、この例では、サブメニュータグの名前は次のようになります。 <holidayset ...

2つのコントローラーで、タグ名とパラメーターが等しくありませんでした。

于 2012-10-05T11:19:36.153 に答える
4

確かに言うにはあまりにも多くの要因が関係しています。最も迅速な解決策は、これを自分でデバッグすることです。

_buildMenuArray' inapp/code/core/Mage/Adminhtml/Block/Page/Menu.php`を見てください。そこのどこかに、このようなものから始まる foreach ループが表示されるはずです

    foreach ($parent->children() as $childName => $child) {
        if (1 == $child->disabled) {
            continue;
        }

        $aclResource = 'admin/' . ($child->resource ? (string)$child->resource : $path . $childName);
        if (!$this->_checkAcl($aclResource)) {
            continue;
        }

        if ($child->depends && !$this->_checkDepends($child->depends)) {
            continue;
        }

これは、管理ナビゲーションを構築するブロックのメニュー情報の配列を構築するループです。これらのcontinueガード句のいずれかがトリガーされると、Magento は特定のメニューのレンダリングをスキップします。_checkAclこの特定のメニューでメソッドが失敗する理由を確認することをお勧めします。私の推測 (あなたの投稿のスキミングに基づく) は、レンダリングされていない子メニューの ACL ロールが欠落していることです。

幸運を!

于 2012-10-04T20:37:40.613 に答える