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 isAllowed
parece 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::saveRel
inserçã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.
fonte
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Respostas:
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.
fonte
O valor padrão em
Mage_Admin_Model_Session
é realmentefalse
(não faria sentido de outra forma):Mas o que poderia ter acontecido é que as funções tinham permissões definidascatalog
, 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.
fonte
isAllowed('catalog')
- ele não permite implicitamente o acesso a todos os filhos. Desculpe pela desinformação!