先日リリースされたMagento Community Edition 1.9.2.0と過去バージョンに対するセキュリティパッチ・SUPEE−6285を適用した1.9.1.1以前のバージョンでは、それまで発生しなかったトラブルが起きることがあります。
このエントリでは発生するトラブルの内容とその原因・対処法について解説します。

発生するトラブルとは

SUPEE−6285の適用後、またはMagento Community Edition 1.9.2.0以降では、利用できる機能に制限のある管理ユーザーが、許可されているはずの機能にアクセスすると、「アクセス拒否」というメッセージが画面上に表示されることがあります。

アクセス拒否

なぜ、「アクセス拒否」と表示されるのか

Magentoの管理ユーザーは、あらかじめ定義された権限に基づいて、機能にアクセスできるかどうかが判断されます。

Magento Community Edition 1.9.2.0以前もしくはSUPEE−6285未適用の環境では、管理者権限のチェックを行っている Mage_Adminhtml_Controller_Action の _isAllowed メソッドの処理は以下のようになっています。

    protected function _isAllowed()
    {
        return true;
    }

これに対し、パッチ適用後もしくはMagento Community Edition 1.9.2.0以降では同じ処理は以下のようになっています。

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

Mage_Admin_Model_Session に定義されている isAllowed メソッドは、管理者権限の定義を参照して、その機能にアクセスできるかどうかを判定します。

引数に「admin」が与えられた場合、 admin_rule テーブルにある、 resource_id 列のデータが「admin」に完全一致するデータを検索し、アクセス許可か拒否かを判断します。権限を制限している場合は、このデータは deny になっているため、「アクセス拒否」とMagentoが判断してしまいます。

どのように対策すればよいのか

「アクセス拒否」となってしまう機能を管理している Controller クラスを探し、 _isAllowed メソッドの定義内容を確認します。

エラーになる場合は、以下の2通りの状況が考えられます。 

  • _isAllowed が定義がされていない
  • 定義されているが、引数の値が適切ではない

前者の場合は、 _isAllowed を定義します。このとき、引数の値が適切ではないと意味がありません。
後者の場合、および前者の対策時に引数に与える値は、「admin」ではなく、「sales」や「customer」といった名称で始まる権限名を指定します。
「admin」を引数に与えると、すべての管理者権限をチェックしに行くので、権限を制限している場合は「アクセス拒否」になってしまいます。 

弊社製エクステンションの対応について

現在弊社では、弊社製エクステンションの動作検証を進めております。
もし「アクセス拒否」などのメッセージが表示された場合は、ご一報ください。