[CakePhp] Editar Permisos ACL

Publicado: 7 septiembre, 2010 en CakePhp, Programación
Etiquetas:, , ,

Bueno, hay muchas cosas que decir sobre cakephp, pero una de las cosas con las que me encontré fue la dificultad de editar o gestionar los permisos ACL directamente atraves del sistema por lo que tuve que trabajar en una forma de hacerlo y finalmente lo logre asi que les pongo mi solucion.

Para empezar tenemos la función add

function add() {

	if (!empty($this->data)) {
		$acosdata = $this->data['Acos'];
		unset($this->data['Acos']);
		if ($this->User->save($this->data)) {
			$id = $this->User->getLastInsertID();
			$aro =& $this->Acl->Aro;
			$usuario = $aro->findByForeignKeyAndModel($id, 'User');
			$aro->id = $usuario['Aro']['id'];
			$aro->save(array('alias' => $this->data['User']['username']));
			foreach($acosdata as $clv=>$envi){
				foreach($envi as $clave => $valor){
					if($valor == 'S'){
						$this->Acl->allow($this->data['User']['username'], 'controllers/'.$clv.'/'.$clave);
					}else{
						$this->Acl->deny($this->data['User']['username'], 'controllers/'.$clv.'/'.$clave);
					}
				}
			}

			$this->redirect(array('action' => 'index'));

		}

	}else{

		$this->loadModel('Aco');

		$grupo = $this->User->Group->find("list");

		$this->set("groups", $grupo);

		$acos = $this->Aco->find('all');

		$this->set("acos", $acos);

	}

}

Primero que nada asumo que ya siguieron el manual del book de cakephp y les funciono bien. Para empezar en el manual del book de cakephp al momento de crear nuevos usuarios o grupos el sistema crea automáticamente los aros, pero los crea sin un alias, por lo tanto ingrese las siguientes lineas para una vez creado el usuario y el aro edito el registro y le coloco el alias:

$id = $this->User->getLastInsertID();
$aro =& $this->Acl->Aro;
$usuario = $aro->findByForeignKeyAndModel($id, 'User');
$aro->id = $usuario['Aro']['id'];
$aro->save(array('alias' => $this->data['User']['username']));

Las siguientes lineas recogen la información que viene del formulario con todos los permisos los guardan en una variable y luego lo elimina de $data para evitar problemas con la base de datos al momento de guardar

$acosdata = $this->data['Acos'];
unset($this->data['Acos']);

Y el siguiente ciclo recorre el arreglo y verifica cuales vinieron en si y cuales en no y les otorga sus respectivos alow o deny

foreach($acosdata as $clv=>$envi){
 foreach($envi as $clave => $valor){
 if($valor == 'S'){
 $this->Acl->allow($this->data['User']['username'], 'controllers/'.$clv.'/'.$clave);
 }else{
 $this->Acl->deny($this->data['User']['username'], 'controllers/'.$clv.'/'.$clave);
 }
 }
}

Hasta aqui es la informacion de cuando ya se envio el formulario, antes de enviarlo posrupuesto que debemos enviarle a la vista los datos para que pueda mostrarnos todos los acos que existen en el sistema, las siguientes lineas se encargan de eso:

$this->loadModel('Aco');//cargamos el modelo de los acos
$acos = $this->Aco->find('all');//realizamos la busqueda de todos los acos
$this->set("acos", $acos);//los mandamos a la vista

Hasta aquí los cambios al controlador de users, ahora vamos con la vista.

//creamos una lista
echo "<ul>";
//recorremos todos los acos
foreach($acos as $num=>$aco){
 //mostramos solo los que esten por encima del id 3, o sea, los distintos a controlres, pages y display
 if($aco['Aco']['id'] > 3){
 //comenzamos a buscar los modulos del sistema
 if($aco['Aco']['parent_id'] == 1){
 //imprimimos el nombre
 echo "<li class='permisos'><b>{$aco['Aco']['alias']}</b><ul>";
 //recorremos nuevamente todos los acos en busca de los actions de los modulos
 foreach($acos as $numero=>$aco_h){
 //quitamos el login y logout porque todos tienen permiso a eso
 if($aco_h['Aco']['parent_id'] == $aco['Aco']['id'] and $aco_h['Aco']['alias'] != "login" and $aco_h['Aco']['alias'] != "logout"){

 //les agregamos unos input radio para que escoja
 $options=array('S'=>'Si','N'=>'No');
 $attributes=array('legend'=>$aco_h['Aco']['alias'], 'default' => 0);
 echo $form->radio('Acos.'.$aco['Aco']['alias'].'.'.$aco_h['Aco']['alias'],$options,$attributes);
 }
 }
 echo "</ul></li>";
 }
 }
}
echo "</ul>";

Bueno, esto es lo que debe tener la vista, con esas dos modificaciones debe agregarles el usuario y automáticamente les creara el aro del usuario y los permisos que hayan seleccionado. Esto es un código bastante básico, si quieren ir mas allá pues queda de su parte, también es por ahora solo para ingresar, pero para editar los permisos solo deben tomar esto y adaptarlo, me parece que lo hice lo mas sencillo que pude, de todas formas si algo no esta lo suficientemente claro pueden preguntarme y haré todo lo posible por explicarme mejor.

Anuncios
comentarios
  1. omargalavmar dice:

    me puedes ayudar??.. que herramienta o como mantienes el listado actualizados de los ACO, especificamente de donde sacas la informacion —> $this->loadModel(‘Aco’);

  2. takashius dice:

    No he probado con la versión 2.0

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s