A ACL básica definida na
            seção anterior mostra como vários
            privilégios podem ser permitidos em toda a ACL (todos os recursos).
            Contudo, na prática, controles de acesso tendem a possuir exceções e diversos níveis
            de complexidade. Zend_Acl permite a você realizar estas melhorias
            de uma forma simples e flexível.
        
Para o CMS de exemplo, foi determinado que, embora o grupo 'equipe' cubra as necessidades da grande maioria dos usuários, há necessidade de um novo grupo 'marketing', que necessita de acesso a newsletter e últimas notícias no CMS. O grupo é quase auto-suficiente e terá a habilidade de publicar e arquivar tanto newsletters como últimas notícias.
Adicionalmente, também foi solicitado que o grupo 'equipe' tenha acesso liberado para visualizar notícias mas não possam revisar as notícias mais recentes. Finalmente, deve ser impossível para qualquer um (inclusive adminsitradores) arquivar qualquer notícia de 'comunicado', pois eles ficam visíveis por somente 1 ou 2 dias.
Primeiro, revisamos o registro de papéis para refletir estas alterações. Determinamos que o grupo 'marketing' tem o mesmo conjunto básico de permissões que 'equipe', portanto definimos 'marketing' de modo a herdar as permissões de 'equipe':
// O novo grupo 'marketing' herda permissões de 'equipe'
$acl->addRole(new Zend_Acl_Role('marketing'), 'equipe');
        Em seguida, note que os controles de acesso acima se referem a recursos específicos (ex., "newsletter", "últimas notícias", "comunicados"). Agora vamos adicionar esses recursos:
// Create Resources for the rules
// newsletter
$acl->addResource(new Zend_Acl_Resource('newsletter'));
// Notícias
$acl->addResource(new Zend_Acl_Resource('notícias'));
// Últimas notícias
$acl->addResource(new Zend_Acl_Resource('últimas'), 'notícias');
// Comunicados
$acl->addResource(new Zend_Acl_Resource('comunicados'), 'notícias');
        Então é simplesmente uma questão de definição dessas regras mais específicas para as áreas da ACL:
// Marketing deve publicar e arquivar newsletters e últimas notícias
$acl->allow('marketing',
            array('newsletter', 'últimas'),
            array('publicar', 'arquivar'));
// 'Equipe' (e 'Marketing', por herança) são negados a revisar últimas
//notícias
$acl->deny('equipe', 'últimas', 'revisar');
// Todos (incluindo administradores) não podem arquivar notícias de comunicados
$acl->deny(null, 'comunicados', 'arquivar');
        Agora podemos consultar a ACL, respeitando as últimas alterações:
echo $acl->isAllowed('equipe', 'newsletter', 'publicar') ?
     "permitido" : "negado";
// negado
echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
     "permitido" : "negado";
// permitido
echo $acl->isAllowed('equipe', 'últimas', 'publicar') ?
     "permitido" : "negado";
// negado
echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
     "permitido" : "negado";
// permitido
echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
     "permitido" : "negado";
// permitido
echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
     "permitido" : "negado";
// negado
echo $acl->isAllowed('editor', 'comunicados', 'arquivar') ?
     "permitido" : "negado";
// negado
echo $acl->isAllowed('administrador', 'comunicados', 'arquivar') ?
     "permitido" : "negado";
// negado
    
            Para remover um ou mais regras de acesso da ACL, simplesmente use os
            métodos disponíveis removeAllow() ou
            removeDeny(). Assim como allow() e
            deny(), você pode fornecer um valor NULL
            para indicar aplicação a todos os papéis, recursos e/ou privilégios:
        
// Remove a recusa de revisão de últimas notícias para 'equipe' (e marketing,
// por herança)
$acl->removeDeny('equipe', 'últimas', 'revisar');
echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
     "permitido" : "negado";
// permitido
// Remove a permissão para publicar e arquivar newsletters para 'marketing'
$acl->removeAllow('marketing',
                  'newsletter',
                  array('publicar', 'arquivar'));
echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
     "permitido" : "negado";
// negado
echo $acl->isAllowed('marketing', 'newsletter', 'arquivar') ?
     "permitido" : "negado";
// negado
        
            Privilégios podem ser modificados incrementalmente, como indicado acima, mas um valor
            NULL para privilégios sobrescreve tais mudanças incrementais:
        
// Concede a 'marketing' todas as permissões sobre 'últimas notícias'
$acl->allow('marketing', 'últimas');
echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
     "permitido" : "negado";
// permitido
echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
     "permitido" : "negado";
// permitido
echo $acl->isAllowed('marketing', 'útlimas', 'qualquer coisa') ?
     "permitido" : "negado";
// permitido