Avançar para a área de conteúdo

ir para o conteúdo principal

developerWorks Brasil  >  Software livre  >

Crie Web sites rapidamente com CakePHP, Parte 2: Faça mais e melhor com CakePHP

developerWorks
Ir para a página anteriorPágina 5 de 14 Ir para a próxima página

Opções de documento

Código de amostra


Classificar este tutorial

Ajude-nos a melhorar este conteúdo


Listas de controle de acesso

Até aqui, o Tor está completamente aberto em termos de acesso. Por exemplo, qualquer um pode acrescentar, editar ou excluir produtos, etc. É hora de bloquear algumas de suas funcionalidades. Para isso, usaremos a funcionalidade ACL do CakePHP.

O que é uma ACL?

Uma ACL é, basicamente, uma lista de permissões. É isso. Não é um meio de autenticação de usuário. Não é a solução milagrosa para a segurança PHP. Uma ACL é apenas uma lista de quem pode fazer o quê.

Quem é, em geral, um usuário, mas pode ser algo como um controlador. Quem é chamado de objeto de solicitação de acesso (ARO). Fazer o quê, nesse caso, normalmente significa "executar código". Fazer o que é chamado de objeto de controle de acesso (ACO).

Portanto, um ACL é uma lista de AROs e ACOs à qual eles têm acesso. Simples, não? Deveria ser. Mas não é.

Assim que a explicação sai do "é uma lista de quem pode fazer o que" e começa jogar esses acrônimos de três letras (TLAs) para cima de você, as coisas podem desandar. Mas um exemplo vai ajudar.

Imagine que há uma festa em um clube. Todo mundo importante está lá. A festa é dividida em várias seções — há o lounge VIP, a pista de dança e o bar principal. E, é claro, uma fila enorme de gente tentando entrar. O enorme e assustador leão-de-chácara da entrada verifica as identificações de todos, olha A Lista e dispensa a pessoa ou a deixa entrar na seção da festa para a qual foi convidada.

As pessoas que querem entrar são os AROs. Estão solicitando acesso às diferentes seções da festa. O lounge VIP, a pista de dança e o bar principal são os ACOs. A ACL é o enorme e assustador leão-de-chácara na porta com sua prancheta. O enorme e assustador leão-de-chácara é o CakePHP.



Voltar para parte superior


Criando uma tabela de ACL

No CakePHP V1.1, o gerenciamento de ACL funcionava como o Bake, via script PHP que você chamava diretamente. No CakePHP V1.2, o gerenciamento de ACL faz parte do Cake Console. Usando o Cake Console, você pode configurar uma tabela de banco de dados para ser usada para armazenar as informações da ACL. Na linha de comando, a partir do diretório /webroot/app, execute o seguinte comando: ../cake/console/cake schema run create DbAcl. O Cake Console o avisará que vai criar tabelas (mesmo que não apareçam) e depois lhe perguntará se você deseja criar três tabelas (responda sim para ambos). Quando terminar, o Bake lhe dirá que criou três bancos de dados (veja a Figura 6): acos, aros e aros_acos.


Figura 6. Saída de Shell da ACL
acl.php output

Só precisa isso para começar. Agora é o momento de começar a definir seus AROs e ACOs.



Voltar para parte superior


Definindo AROs

Então você tem as tabelas de banco de dados de ACL. E tem um aplicativo que permite que os usuários façam o próprio registro. Como criar os AROs para os seus usuários?

Faz muito sentido acrescentar isso à parte de registro do aplicativo. Desse modo, quando novos usuários se inscrevem, seu ARO correspondente é criado automaticamente para eles. Isso significa que terá de criar manualmente dois AROs para os usuários que já criou, mas o CakePHP também facilita isso.



Voltar para parte superior


Definindo grupos

No CakePHP (e ao usar ACLs em geral), os usuários podem ser designados a grupos com o fim de atribuir ou revogar permissões. Isso simplifica muito a tarefa de gerenciamento de permissão, visto que você não precisa lidar com permissões individuais de usuário, o que pode se tornar uma tarefa e tanto se seu aplicativo tiver um número razoável de usuários.

No caso do Tor, você vai definir dois grupos. O primeiro grupo, chamado de Usuários, será usado para classificar todos que simplesmente registraram uma conta. O segundo, chamado Vendedores, será usado para conceder a certos usuários permissões adicionais dentro do Tor. Você criará ambos esses grupos usando o Cake Console, mais ou menos como fez ao criar o banco de dados da ACL. Para criar os grupos, execute os comandos abaixo no diretório /webroot/app.

../cake/console/cake acl create aro 0 Users
../cake/console/cake acl create aro 0 Users
                

Após cada comando, o CakePHP deve mostrar uma mensagem dizendo que o ARO foi criado.

New Aro 'Users' created.
New Aro 'Dealers' created.

Os parâmetros que você inseriu (por exemplo, '0 Usuários') são o pai e nó. O parâmetro-pai deve corresponder ao grupo ao qual o ARO deve pertencer. Visto que esses grupos são de nível máximo, você os passou como 0. O parâmetro node é uma cadeia de caractere usada para se referir ao grupo.



Voltar para parte superior


Acrescentando a criação de ARO ao registro

Acrescer a criação de ARO à parte de registro do usuário no Tor não é difícil. É só uma questão de incluir o componente certo e acrescentar umas linhas de código. Para refrescar sua memória, a função de registro de users_controller.php deve se parecer à Listagem 10.


Listagem 10. Ação register original
                    
    function register()
    {
if (!empty($this->data))
{
$this->data['User']['password'] = md5($this->data['User']
			      ['password']);
if ($this->User->save($this->data))
{
$this->Session->setFlash('Your registration information
 				   was accepted');
$this->Session->write('user', $this->data['User']
				   ['username']);
$this->redirect(array('action' => 'index'), null, true);
} else {
$this->data['User']['password'] = '';
$this->Session->setFlash('There was a problem saving
 				  this information');
}
}
    }
                

Para começar a usar o componente ACL do CakePHP, você precisa incluí-lo como variável de classe.


Listagem 11. Incluindo os componentes como variável de classe
                    
<?php
class UsersController extends AppController
{
  var $components = array('Acl');
  ...
                

O array $components simplesmente contém uma lista de componentes CakePHP a incluir, por nome. Os componentes são para os Controladores o que os Auxiliares são para as Visualizações. Há outros componentes disponíveis, como o de segurança, que será tratado em um tutorial posterior. Neste caso, o único de que você precisa é o ACL.

Agora você tem acesso a toda a funcionalidade fornecida pelo componente ACL. Você pode criar um ARO invocando o método create no objeto do ACL ARO (que será mais fácil de ler na Listagem 12). Esse método usa os mesmos parâmetros que você normalmente passaria ao chamar o método create a partir de um modelo, que é essencialmente o que você está fazendo. Neste caso, você especifica o nome do alias (o nome de usuário), o modelo para o qual o ACL aponta (usuário), o foreign_key para o registro (a nova identificação de usuário) e o parent_id (a identificação do nó-pai — neste caso, o grupo de ARO de Usuário, que é encontrado usando a linha findByAlias, abaixo). Para criar o ARO para o seu usuário, você também precisa saber qual é a identificação do usuário que foi salva. Você pode saber isso por meio de $this->User->id após os dados serem salvos.

Juntando tudo, sua função register agora deve se parecer à Listagem 12.


Listagem 12. Função Register
                    
    function register()
    {
if (!empty($this->data))
{
$this->data['User']['password'] = md5($this->data['User']
			['password']);
if ($this->User->save($this->data))
{
$this->Session->setFlash('Your registration information
 				  was accepted');
$this->Session->write('user', $this->data['User']['username']);
$parent = $this->Acl->Aro->findByAlias('Users');
                $aro = new Aro();
                $aro->create();
                $aro->save(array(
'alias' => $this->data['User']['username'],
'model' => 'User',
'foreign_key' => $this->User->id,
'parent_id' => $parent['Aro']['id'])
);
$this->Acl->Aro->save();
$this->redirect(array('action' => 'index'), null, true);
} else {
$this->data['User']['password'] = '';
$this->Session->setFlash('There was a problem saving
 				  this information');
}
}
    }
                

Você notará que o ARO não é criado até que o salvamento seja bem-sucedido.

Experimente

Isso deve ser tudo o que você precisa para que seus AROs entrem em operação. Para verificar, recomece na linha de comando em webroot/app e peça ao Cake Console para ver a árvore de ARO: ../cake/console/cake acl view aro. Você deve ver algo como o que é mostrado na Figura 7.


Figura 7. Resultado de ARO de visualização de shell da ACL com lista vazia
Output from acl.php view ARO with empty list

Agora acesse http://localhost/users/register e inscreva um novo usuário. Depois de fazer isso, execute de novo o comando ../cake/console/cake acl view aro. Você deve ver algo como o que é mostrado na Figura 8.


Figura 8. Resultado de ARO de visualização de shell da ACL com um usuário
Output from acl.php view ARO with a user

De agora em diante, sempre que alguém registrar uma nova conta, um ARO será criado automaticamente para ele. O ARO vai pertencer ao grupo Usuários.



Voltar para parte superior


Criando AROs para usuários existentes

Agora que os AROs estão sendo criados para os novos usuários do Tor, você precisa voltar e criar AROs para os usuários existentes. Você fará isso com o Cake Console, quase que exatamente da mesma maneira em que criou os grupos. Comece usando aquele usuário que você acabou de criar acessando http://localhost/users/knownusers para obter uma lista dos usuários que foram criados.


Figura 9. Resultado de ARO de visualização de shell da ACL com um usuário
Output from acl.php view aro with a user

Daí, para cada usuário, você precisará executar o comando de criação de ARO, como fez ao criar os grupos. No caso de pai, especifique 'Usuários'. No caso do nó, especifique o nome do usuário. Por exemplo, na Figura 9, para criar um ARO para dentarthurdent, execute o seguinte (mais uma vez, no diretório /webroot/app): ../cake/console/cake acl create aro Users dentarthurdent.

Certifique-se de executar esses comandos para cada usuário na sua lista knownusers, exceto para aqueles que você criou para testar a criação de ARO durante o registro de usuário. Confirme se você está especificando a identificação e nome de usuário corretos para cada usuário. Quando terminar, o resultado de ../cake/console/cake acl deve ser semelhante à Figura 10.


Figura 10. Resultado de ARO de shell da ACL com um usuário
Output from acl.php view ARO with a user

Você pode obter ajuda sobre algumas das outras coisas que o Cake Console pode fazer com ACLs executando ../cake/console/cake acl help na linha de comando.



Voltar para parte superior



Ir para a página anteriorPágina 5 de 14 Ir para a próxima página