Este documento explica como implementar o Zend_ACL para controle de permissões de acesso em um sistema usando roles e recursos. Ele cria um plugin que adiciona regras de acesso para um perfil "guest", controlando o acesso aos módulos "ADMIN" e "DEFAULT" do sistema.
2. 1 – Objetivo
Explicar como funciona o Zend_ACL para o controle de permissões de
acessos ao sistema através de Roles e Resources. Iremos criar um plug-in para
controlar as permissões de acesso.
2 – Dificuldade
Médio
3 – Logica aplicada
Sistema modular com dois módulos “ADMIN” e “DEFAULT”, criar regras e
perfis de acesso ao sistemas. Teremos apenas um perfil “guest”
4 – Observações
Não pretendo explica como funciona o zend, nem tão pouco como deve ser
configurado. O objetivo do tutorial é explicar apenas o Zend_ACL, como funciona
e como aplica-lo. Caso queira entender a estrutura, segue em anexo o exemplo
sendo assim observe e estude ou qualquer coisa mande e-mail ;)
5 – Imagem da estrutura
3. 1 – permissao/application/BootStrap.php
...
protected function _initSession() {
// Criando uma sessão com o nome “SYSPANEL”
$applicationSession = new Zend_Session_Namespace('SYSPANEL');
// Adicionando a session um valor para “userRole” caso não exista
if (!isset($applicationSession->userRole)) {
// Atribuindo o valor “guest” para o “userRole”
$applicationSession->userRole = 'guest';
}
}
protected function _initACL() {
// Instanciando o Zend_ACL
$acl = new Zend_Acl();
// Criando uma regra para o perfil “guest” no Zend_ACL
$acl->addRole(new Zend_Acl_Role('guest'));
// Registrando a variavel $acl para que seja visível em toda a aplicação
Zend_Registry::set('ACL', $acl);
}
…
2 – permissao/library/DLSistema/Restrict/Access.php
class DLSistema_Restrict_Access extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
// Pegando o Model -> Controller -> Action
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
// Pegando a sessão iniciada
$applicationSession = new Zend_Session_Namespace('SYSPANEL');
// Pegando o Zend_ACL resgistrado no Bootstrap
$acl = Zend_Registry::get('ACL');
// Criando acesso ao Model:Controller -> Action
$acl->add(new Zend_Acl_Resource('default:index','index'));
$acl->add(new Zend_Acl_Resource('admin:index','index'));
// Permissão ao Model -> Controller -> Action
$acl->allow('guest','default:index', array('index','add','edit'));
$acl->allow('guest','admin:index', array('index'));
// Vefificando Permissão
$allowed = $acl->isAllowed($applicationSession->userRole,$module.':'.$controller,$action);
// Redirecionando caso não tenha permissão
if(!$allowed) {
$request->setModuleName('default');
$request->setControllerName('error');
$request->setActionName('denied');
$request->setDispatched();
}
}
}