Standar Sumber Daya Peran ACL

8

Katakanlah kita menambahkan beberapa sumber daya baru ke ACL seperti:

<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>

Kami kemudian menambahkan berikut ini di sekitar tombol yang muncul di kotak SearchTerm:

if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
    $this->_addButton('import', array(
        'label'   => 'Import Search Terms',
        'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
    ));
}

Jika saya kemudian login sebagai pengguna non-admin, saya benar-benar akan berpikir bahwa perilaku yang diharapkan tidak akan ada tombol yang terlihat, karena saya belum secara eksplisit memberikan peran sumber daya kepada pengguna. Namun ternyata, nilai pengembalian default isAllowedtampaknya benar. Untuk memperumit masalah, ketika Anda pergi dan melihat sumber daya untuk peran itu, kotak centang tidak akan muncul dicentang.

Saya dapat menyelesaikan 'masalah' dengan mengklik melalui setiap peran dan mengklik simpan, tetapi ini adalah PITA yang harus dilakukan terutama di seluruh lingkungan live / stage / dev. Apakah ada cara mudah untuk secara otomatis menolak sumber daya ini dari setiap peran melalui kode? Saya tidak keberatan menambahkan skrip migrasi jika diperlukan. Saya melihat sekilas apa yang terjadi dalam tindakan yang sama. Agaknya, saya bisa melakukan ini dengan memuat semua peran, mengulanginya dan melakukan logika yang sama untuk Mage_Admin_Model_Resource_Rules::saveRelmemasukkan baris ke dalam tabel. Tetapi kode ini tampaknya mengasumsikan bahwa semua sumber daya diposting, yang artinya untuk menjalankannya secara langsung, saya perlu mencari tahu format apa yang saya perlukan untuk menyampaikan data dan mungkin memuat sumber daya yang ada juga.

Peter O'Callaghan
sumber
Tidak yakin Anda menggunakan 'isAllowed' dengan benar - bukankah seharusnya ini? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird
Sepertinya bug bagi saya
Fabian Blechschmidt

Jawaban:

2

Saya tidak dapat membuat ulang masalah di 1.13.1.0. Saya menggunakan kode persis Anda kecuali saya menggunakannya untuk mengubah judul halaman secara kondisional. Saya pertama kali menguji ini dengan pengguna yang masuk dengan semua izin dan metode isAllowed kembali benar. Saya kemudian membuat peran lain yang tidak memiliki kotak centang ini dipilih tetapi memiliki semua kotak lain yang dipilih dan kemudian saya logout dan login kembali dengan pengguna yang dilampirkan ke peran baru ini dan diijinkan kembali palsu. Anda dapat mencoba keluar dan masuk kembali. Jika ini masih tidak berfungsi, coba bersihkan cache dan sesi Anda dan masuk kembali.

Jonathan Hodges
sumber
0

Nilai default dalam Mage_Admin_Model_Sessionsebenarnya false(tidak masuk akal jika tidak):

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;
}

Tetapi apa yang mungkin terjadi adalah, bahwa peran memiliki izin yang ditetapkan catalog, yaitu Anda tidak memilih semua anak tunggal tetapi kotak centang katalog itu sendiri. Kemudian disimpan sebagai satu izin yang diperhitungkan untuk semua anak ( catalog/*), bahkan jika mereka ditambahkan kemudian.

Maaf, itu tidak benar. Setiap izin disimpan secara terpisah sebagai tambahan untuk induk.

Fabian Schmengler
sumber
Di mana logika yang memungkinkan satu izin untuk menjelaskan semua anak?
Peter O'Callaghan
Saya memeriksa lagi dan tidak dapat menemukannya, sepertinya sumber daya orang tua ini hanya ada sehingga Anda dapat memeriksa isAllowed('catalog')- tidak secara implisit mengizinkan akses ke semua anak. Maaf atas informasi yang salah!
Fabian Schmengler