Ruolo ACL Predefinito risorsa


8

Supponiamo di aggiungere alcune nuove risorse all'ACL in questo modo:

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

Aggiungiamo quindi quanto segue attorno a un pulsante che appare nella griglia di SearchTerm:

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

Se quindi eseguissi l'accesso come utente non amministratore, avrei davvero pensato che il comportamento previsto non sarebbe stato visibile alcun pulsante, dal momento che non ho esplicitamente assegnato agli utenti il ​​ruolo della risorsa. A quanto pare però, il valore di ritorno predefinito di isAllowedsembra essere vero. Per complicare le cose, quando vai a visualizzare le risorse per quel ruolo, la casella di controllo non appare spuntata.

Posso risolvere il "problema" facendo clic su ciascun ruolo e facendo clic su Salva, ma questa è una PITA da fare soprattutto in ambienti live / stage / dev. Esiste un modo semplice per negare automaticamente questa risorsa da ciascun ruolo tramite codice? Non mi dispiace aggiungere uno script di migrazione, se necessario. Ho dato una rapida occhiata a ciò che accade nella stessa azione. Presumibilmente, potrei farlo caricando tutti i ruoli, eseguendone il ciclo ed eseguendo una logica simile Mage_Admin_Model_Resource_Rules::saveRelall'inserimento delle righe nella tabella. Ma questo codice sembra supporre che tutte le risorse siano pubblicate, il che significherebbe che per invocarlo direttamente avrei bisogno di capire in quale formato devo passare i dati e possibilmente caricare anche le risorse esistenti.


Non sei sicuro di utilizzare correttamente "isAllowed" - non dovrebbe essere questo? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird,

Mi sembra un insetto
Fabian Blechschmidt,

Risposte:


2

Non sono stato in grado di ricreare il problema su 1.13.1.0. Ho usato il tuo codice esatto tranne che l'ho usato per cambiare il titolo della pagina in modo condizionale. Ho prima provato questo con un utente che ha effettuato l'accesso con tutte le autorizzazioni e il metodo isAllowed è tornato vero. Ho quindi creato un altro ruolo che non ha selezionato questa casella di controllo ma che ha selezionato tutte le altre caselle, quindi ho effettuato il logout e ho effettuato nuovamente l'accesso con un utente collegato a questo nuovo ruolo e isAllowed restituiva false. Potresti provare a disconnetterti e riconnetterti. Se il problema persiste, prova a svuotare la cache e le sessioni e ad accedere nuovamente.


0

Il valore predefinito in Mage_Admin_Model_Sessionè in realtà false(altrimenti non avrebbe senso):

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

Ma quello che potrebbe essere successo è che per i ruoli sono state impostate le autorizzazioni catalog, ovvero non hai selezionato tutti i singoli figli ma la casella di controllo del catalogo stesso. Quindi viene salvato come un'autorizzazione che conta per tutti i bambini ( catalog/*), anche se vengono aggiunti in seguito.

Scusa, non era vero. Ogni autorizzazione viene salvata separatamente in aggiunta al genitore.


Dov'è la logica che consente un'autorizzazione per rendere conto di tutti i bambini?
Peter O'Callaghan,

Ho ricontrollato e non sono riuscito a trovarlo, sembra che queste risorse genitore esistano solo in modo che tu possa verificarle isAllowed('catalog')- non consente implicitamente l'accesso a tutti i bambini. Ci scusiamo per la disinformazione!
Fabian Schmengler,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.