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.
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
Só precisa isso para começar. Agora é o momento de começar a definir
seus AROs e ACOs.
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.
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.
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
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
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.
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
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
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.
|