Padrão do recurso de função da ACL

8

Digamos que adicionemos alguns novos recursos à ACL da seguinte maneira:

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

Em seguida, adicionamos o seguinte em torno de um botão que aparece na grade do SearchTerm:

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

Se eu fizer logon como um usuário não administrador, realmente pensaria que o comportamento esperado não seria um botão visível, pois não dei explicitamente aos usuários a função de recurso. Porém, o valor de retorno padrão de isAllowedparece ser verdadeiro. Para complicar, quando você visualizar os recursos para essa função, a caixa de seleção não aparecerá marcada.

Posso resolver o 'problema' clicando em cada função e clicando em Salvar, mas este é um PITA a ser feito especialmente em ambientes ao vivo / estágio / dev. Existe alguma maneira fácil de negar automaticamente esse recurso de cada função via código? Não me importo de adicionar um script de migração, se necessário. Eu dei uma olhada rápida no que acontece na mesma ação. Presumivelmente, eu poderia fazer isso carregando todas as funções, percorrendo-as e executando uma lógica semelhante à Mage_Admin_Model_Resource_Rules::saveRelinserção das linhas na tabela. Mas esse código parece assumir que todos os recursos são postados, o que significaria que, para invocá-lo diretamente, eu precisaria descobrir em qual formato eu preciso passar os dados e possivelmente carregar também os recursos existentes.

Peter O'Callaghan
fonte
Não tem certeza de que está usando 'isAllowed' corretamente - não deveria ser isso? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird
Parece um bug para mim #
Fabian Blechschmidt

Respostas:

2

Não foi possível recriar o problema na 1.13.1.0. Eu usei seu código exato, exceto para alterar o título da página condicionalmente. Testei isso pela primeira vez com um usuário conectado com todas as permissões e o método isAllowed retornou true. Em seguida, criei outra função que não tinha essa caixa de seleção marcada, mas tinha todas as outras caixas marcadas e, em seguida, efetuei logon e logon novamente com um usuário conectado a essa nova função e isAllowed estava retornando false. Você pode tentar sair e fazer login novamente. Se isso ainda não estiver funcionando, tente limpar o cache e as sessões e fazer login novamente.

Jonathan Hodges
fonte
0

O valor padrão em Mage_Admin_Model_Sessioné realmente false(não faria sentido de outra forma):

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

Mas o que poderia ter acontecido é que as funções tinham permissões definidas catalog, ou seja, você não selecionou todos os filhos únicos, mas a própria caixa de seleção do catálogo. Em seguida, ele é salvo como uma permissão que conta para todos os filhos ( catalog/*), mesmo que sejam adicionados posteriormente.

Desculpe, isso não era verdade. Toda permissão é salva separadamente adicionalmente ao pai.

Fabian Schmengler
fonte
Onde está a lógica que permite uma permissão para explicar todas as crianças?
Peter O'Callaghan
Eu verifiquei novamente e não consegui encontrá-lo, parece que os recursos pai existem apenas para que você possa procurar isAllowed('catalog')- ele não permite implicitamente o acesso a todos os filhos. Desculpe pela desinformação!
Fabian Schmengler