Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tylër

[Resolvido] Acl - Problemas em permissões de usuários

Recommended Posts

Boa noite, espero que quem tenha algum problema parecido, possa me ajudar, pois não dá pra setar manualmente as permissões de todos usuários em tudo na tabela aros_acos não é?! Imagem Postada

Seguinte:

 

Tem algo errado no código que geram as permissões na tabela aros_acos.

 

Não importa qual tutorial ou qual ajuda eu receba, todos estão confusos, em relação à isso.

 

Vejam:

 

Se defino para um usuário apenas visualizar e editar posts, como ele pode ter direitos de add novo e deletar também? :mellow:

 

Action initDB()

# Parcial. Mesmas permissões dos usuários só que possui uma a mais: "Editar topicos"
 	$groupuser->id = 2;
 	$this->Acl->deny( $groupuser, 'controllers' );
 	$this->Acl->allow( $groupuser, 'controllers/Posts/view' );
 	$this->Acl->allow( $groupuser, 'controllers/Posts/edit' );

 	# Usuários podem visualizar quase tudo, no entando, podem add scraps, comentários em posts,
 	# votar em enquetes, add newsletter, entrar em contato, visualizar parceiros.
 	$groupuser->id = 3;
 	$this->Acl->deny( $groupuser, 'controllers' );
 	$this->Acl->allow( $groupuser, 'controllers/Posts' );
 	$this->Acl->allow( $groupuser, 'controllers/Posts/view' );

Mas ambos conseguem add e deletar posts também, não sei como isso aconteceu...

 

ACOS

 

Imagem Postada

 

 

AROS

 

Imagem Postada

 

 

AROS_ACOS

 

Imagem Postada

 

 

AROS_ACOS continuação

 

Imagem Postada

 

 

Agradeço a ajuda!

 

Att.

 

Alguém que trabalha com Acl nunca passou por isto? Sério? oO

Então qual foi a solução e/ou o método para popular a tabela aros_acos de permissões? Pois pelo método mostrado no cookbook gera estas irregularidades como eu mostrei acima...

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifiquei que na sua tabela de ARO existem diversos elementos root, o mais correto e você ter apenas um elemento root e ir gerando os filhos apartir dele, da mesma forma que é feito na tabela ACO onde você tem um elemento root único que é o "controllers".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifiquei que na sua tabela de ARO existem diversos elementos root, o mais correto e você ter apenas um elemento root e ir gerando os filhos apartir dele, da mesma forma que é feito na tabela ACO onde você tem um elemento root único que é o "controllers".

 

Na Aros tem diversos elementos Root? Não entendi... Todo mundo que me orientou, faz desta forma.

 

Bom, as funções utilizadas foram às seguintes:

 

model: User

/**
 	* Agir como um Request
 	*
 	* Auth armazena informações sobre o usuário conectado no momento da sessão,
 	* no entanto estamos a construir um sistema de controle de acesso baseado em grupos.
 	*/
	# User agora está vinculado à tabela ACL
	var $actsAs = array( 'Acl'=>array( 'type'=>'requester' ) );
	# A maneira acima vincula o behavior Acl como ARO

	function parentNode() {
 	if( !$this->id && empty($this->data) ) {
 	return null;
 	}
 	if( isset($this->data['User']['groupuser_id']) ) {
 	$groupuser_id = $this->data['User']['groupuser_id'];
 	} else {
 	$groupuser_id = $this->field('groupuser_id');
 	}
 	if( !$groupuser_id ) {
 	return null;
 	} else {
 	return array( 'Groupuser'=>array( 'id'=>$groupuser_id ) );
 	}
	}

/**
 	* Callback afterSave ( após salvar )
 	* Update the aro for the user.
 	*
 	* Ao modificar um usuário, você deve atualizar manualmente o ARO correspondente.
 	* Uma alternativa à essa atualização do ARO após uma mudança no groupuser_id é adicionar
 	* este código à seu model User. Assim você não precisa se preocupar em duplicar código.
 	*
 	* Atualiza o aro para o usuário.
 	*
 	* @access public
 	* @return void
 	*/
	function afterSave( $created ) {
 	if ( !$created ) {
 	$parent = $this->parentNode();
 	if( !is_null($parent) ) {
 	$parent = $this->node( $parent );
 	$node = $this->node();
 	$aro = $node[0];
 	$aro['Aro']['parent_id'] = $parent[0]['Aro']['id'];
 	$this->Aro->save( $aro );
 	}
 	}
	}

e no model: Groupuser

# Groupuser agora está vinculado à tabela ACL
	var $actsAs = array( 'Acl'=>array( 'type'=>'requester' ) );
	
	function parentNode() {
 	return null;
	}

Bom, é isto que utilizo para popular e gerenciar a tabela aros

Compartilhar este post


Link para o post
Compartilhar em outros sites

na sua tabela ARO, os valores LFT e RGHT não estão configurados corretamente, isso ocorre pois todos os grupos de usuários são elementos root. A única vez que tentei fazer dessa forma deu diversos erros que acabei desistindo, costumo utilizar a seguinte estrutura:

 

visitante

---|

---|- grupo 1

---|---|

---|---|- usuario 01

---|---|- usuario 02

---|---|

---|---|- grupo 03

---|---|---|

---|---|---|- usuario 03

---|

---|- grupo 2

---|---|

---|---|- usuario 04

 

 

e por ai vai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, entendo...

Mas estou procurando uma solução precisa para isto, pois pretendo, com a ajuda de outro desenvolvedor, adicionar a tabela initDB ao sistema, assim o próprio admin decidirá os níveis...

 

Por enquanto vou continuar com minha app fechada, sem administração e vou procurar alguém que usa ACL no cakePHP pra resolver ist, pois estou apenas começando com Acl.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, encontrei umas aplicações em blogs gringos para testar, retornarei assim que puder, pois não posso esperar mais ....

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, somente após ler este tuturial:

 

http://aranworld.com/article/169/acl-and-auth-tutorial-database-setup

 

pude entender melhor o que você me explicou.

 

Agora ficou claro para mim que a árvore tem que começar do usuário mais restrito, ou visitante e ir avançando para os demais, que por final, herdarão as permissões dos usuários acima deles ( deu pra entender? )

 

Mas cada caso é um caso, como, no meu caso, eu poderia corrigir isto com apenas as duas funções que eu postei?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Venho informar que desisti do Acl e estou usando apenas Auth + autorize! Resolvido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

desiste não cara, na primeira vez realmente você perde algum tempo, pois o código do exemplo que consta na documentação do cakephp funciona, mas pra ficar 100% você precisar fazer algumas melhorias. tenta dar preferência por criar os registros das tabelas ACO e AROS através do console, pois agiliza bastante o desenvolvimento. Corrige a estrutura da tabela AROS e tenta novamente. Ficaria da seguinte forma:

 

id  | parent_id | model      | foreign_key | alias         | lft | rght

1   | 0         | null       | 0           | visitante     | 1   | 14
2   | 1         | UserGroup  | 1           | usuario       | 2   | 13
3   | 2         | UserGroup  | 2           | moderador     | 3   | 10
4   | 3         | UserGroup  | 3           | administrador | 4   | 7
5   | 2         | User       | 1           | usuario-1     | 11  | 12
6   | 3         | User       | 2           | usuario-2     | 8   | 9
7   | 4         | User       | 3           | usuario-3     | 5   | 6

na raiz temos "visitante" que só server de base para a nossa estrutura, a seguir temos "usuario", "moderador", "administrador", "moderador" herda todas as permissões de "usuario" e "administrador" as permissões de "moderador". temos também um usuário para cada grupo. tenta com essa estrutura e me informa se funcionou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.