 | Colocando as ACLs para trabalhar
Você juntou todas as peças, e agora chegou a hora de colocar suas ACLs
para trabalhar. Quando terminar, qualquer usuário terá permissão de ver
os produtos no Tor, mas apenas os que os criaram poderão editá-los ou
excluí-los.
Você vai acrescentar duas linhas a cada ação no controlador de produtos.
Essas linhas vão verificar o acesso do usuário e permitir ou negar a
ação com base nas permissões.
Permitindo que os usuários
apenas vejam os produtos
Comece com a ação view. Acrescente uma linha
para verificar o acesso ao produto, exibindo uma mensagem se a ação não
for permitida.
Listagem 17. Acrescentando uma linha para verificar o acesso ao produto
function view($id = null){
if (!$id) {
$this->Session->setFlash('Invalid Product.', true));
$this->redirect(array('action'=>'index'));
}
$product = $this->Product->read(null, $id);
$alias = $id . '-' . $product['Product']['title'];
if ($this->Acl->check($this->Session->read('user'), $alias;
$id . '-' . $product['Product']['title'], 'read')) {
$this->set('product', $product);
} else {
$this->Session->setFlash('Only registered users may view this product.');
$this->redirect(array('action'=>'index'));
}
}
|
Salve o arquivo, confirme se foi feito o logout do Tor e acesse a
lista de produtos em http://localhost/products. Quando clicar em
um dos produtos, você deverá ser redirecionado para a página de
Registro de Usuário, como mostrado abaixo.
Figura 12. Redirecionamento
Agora, faça login usando qualquer conta e tente de novo. Desta vez,
você deverá poder ver o produto, como se vê na Figura 13.
Figura 13. Vendo o
produto
Isso atende a primeira parte das permissões. Agora você precisa dizer ao
Tor para negar acesso para editar e excluir a qualquer um, menos o
usuário que criou o produto.
Permitindo que apenas o criador
do produto o edite ou exclua
O processo para controlar permissões é bem semelhante às ações
edit e delete
no controlador de produtos.
Listagem 18. Ação edit
function edit($id = null) {
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid Product', true));
$this->redirect(array('action'=>'index'));
}
$product = $this->Product->read(null, $id);
$alias = $id.'-'.$product['Product']['title'];
if ($this->Acl->check($this->Session->read('user'),
$alias, 'update')) {
if (!empty($this->data)) {
if ($this->Product->save($this->data)) {
$this->Session->setFlash(__('The Product has been saved',
true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Product could not be saved.
Please, try again.', true));
}
}
if (empty($this->data)) {
$this->data = $this->Product->read(null, $id);
}
} else {
$this->Session->setFlash('You cannot edit this product.');
$this->redirect(array('action'=>'index'), null, true);
}
$dealers = $this->Product->Dealer->find('list');
$this->set(compact('dealers'));
}
|
Para o controlador de exclusão, você precisa acrescentar duas linhas
para excluir o ACO do produto sendo excluído. Sua ação
delete será semelhante à Listagem 19.
Listagem 19. Ação delete
function delete($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid id for Product', true));
$this->redirect(array('action'=>'index'));
}
$product = $this->Product->read(null, $id);
$alias = $id.'-'.$product['Product']['title'];
if ($this->Acl->check($this->Session->read('user'),
$alias, 'delete')) {
if ($this->Product->del($id)) {
$aco = $this->Acl->Aco->findByAlias($alias);
$this->Acl->Aco->delete($aco['Aco']['id']);
$this->Session->setFlash(__('Product deleted', true));
$this->redirect(array('action'=>'index'));
}
} else {
$this->Session->setFlash('You cannot delete this product.');
$this->redirect(array('action'=>'index'));
}
}
|
Salve o controlador de produtos e faça um teste. Comece fazendo o
logout de http://localhost/users/logout, depois volte à sua lista de
produtos em http://localhost/products/ e tente editar ou excluir o
produto. Você deve ser direcionado de volta à lista de produtos com uma mensagem.
Figura 14. Falha na edição ou
exclusão
Agora, faça o login como o usuário dentarthurdent
e acrescente um produto. Tente editá-lo. Depois, exclua-o. Você não deve
ter problemas para isso.
Figura 15. Edição ou
exclusão bem-sucedida
Faça o logout novamente de http://localhost/users/logout e o login como
outro usuário. Daí, tente editar ou excluir outro produto, e você não
deverá ser capaz de executar essas ações. Enquanto estiver logado, crie
um novo produto e tente modificá-lo ou excluí-lo como outro usuário.
|  |