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')."')"
    ));
}

その後、管理者以外のユーザーとしてログインした場合、ユーザーの役割にリソースを明示的に指定していないため、期待される動作はボタンが表示されないことになると思いました。結局のところ、のデフォルトの戻り値はisAllowedtrueのように見えます。問題を複雑にするために、そのロールのリソースに移動して表示すると、チェックボックスはチェックされていません。

各ロールをクリックして[保存]をクリックすることで「問題」を解決できますが、これは特にライブ/ステージ/開発環境全体で行うPITAです。コードを介して各リソースからこのリソースを自動的に拒否する簡単な方法はありますか?必要に応じて、移行スクリプトを追加してもかまいません。同じアクションで何が起こるかをざっと見ました。おそらく、すべてのロールをロードし、それらをループMage_Admin_Model_Resource_Rules::saveRelし、テーブルに行を挿入するための同様のロジックを実行することで、これを行うことができたでしょう。しかし、このコードはすべてのリソースがポストされていることを前提としているようです。つまり、直接呼び出すには、データを渡すために必要な形式を調べ、場合によっては既存のリソースもロードする必要があります。


「isAllowed」が正しく使用されているかどうかわからない-これではないですか?$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird 2013

私にはバグのようです
Fabian Blechschmidt '27

回答:


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/*、後で追加された場合でも、すべての子()にカウントされる1つの権限として保存されます。

すみません、それは真実ではありませんでした。すべての権限は、親に追加して個別に保存されます。


すべての子供たちを説明する1つの権限を許可するロジックはどこにありますか?
Peter O'Callaghan、2015

もう一度確認しましたが、見つかりませんでした。この親リソースは存在するだけなので、確認isAllowed('catalog')できます。すべての子へのアクセスが暗黙的に許可されているわけではありません。誤報してすみません!
Fabian Schmengler、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.