Wheresoever you go, go with all your heart Confucius

Problema con el ejemplo de Acl en Cakephp

2009-11-27 19:08:15-06

Programacion

Edito: Despues de tomarme las 2 semanas que me recomendaron, agrego algunas impresiones que me dejo esto.


Buenas, he empezado a ver que onda con Cakephp asi que empece a hacer las 2 aplicaciones de ejemplo pero estoy teniendo problemas con la segunda asi que lo posteo por aqui, para ver si alguien me hecha una mano.

He seguido al menos 4 veces las intrucciones (http://book.cakephp.org/view/641/Simple-Acl-controlled-Application) al pie de la letra pero no obtengo el resultado esperado.

Entiendo muy superficialmente que Acl es para otorgar permisos y que Auth para autenticarse (aunque no se como logra toda esa magia), bien, pues les cuento los pasos que he seguido.

1.- Creo la bd, las tablas, y cocino con bake el crud inicial, hasta ahi ningun problema.

2.- Agrego una funcion login y logout en el controlador 'users' y creo la vista al metodo login, en este punto me pregunto si esto:

$session->flash('auth');
echo $form->create('User', array('action' => 'login'));
echo $form->inputs(array(
'legend' => __('Login', true),
'username',
'password'
));
echo $form->end('Login');

es correcto?, he visto que en los comentarios dicen que le hacen falta las etiquetas de php, he preferido copiarlo tal cual.

Es necesario agregar las etiquetas, la vista es simple y llano php -.-'

3.- Creo app/app_controller.php, entiendo que la clase original viene en cake y que debajo de app podemos redeclarar los modelos y los controladores para personalizarlos, esto es correcto?

Sip, es correcto, de hecho es la unica forma (hasta donde se) en la que se pueden personalizar

4.- Agrego en los controladores de 'groups' y 'users' esto:

function beforeFilter() {
parent::beforeFilter();
$this->Auth->allowedActions = array('*');
}

Para otorgar permisos plenos a todos los usuarios/grupos

5.- Inicializo la tabla Acl con

$ cake schema run create DbAcl

Entiendo que se crearan 3 tablas, aqui me empiezo a perder, para que se supone que se usaran cada una?,

La primera, 'acos' (Access Control Object) se refiere a los recursos que se quieren proteger, como la edicion de nuevos posts (que aplica para este ejemplo), mientras que los 'aros' (Access Request Object) son los que tienen que ganarse los permisos, grupos y usuarios. Una vez declarados los jugadores (acos y aros) en la tabla 'aros_acos' se declaran las reglas, quien puede hacer que y como.

6- El tutorial dice que agregue esto al modelo 'users':

var $name = 'User';
var $belongsTo = array('Group');
var $actsAs = array('Acl' => 'requester');

function parentNode() {
if (!$this->id && empty($this->data)) {
return null;
}
$data = $this->data;
if (empty($this->data)) {
$data = $this->read();
}
if (!$data['User']['group_id']) {
return null;
} else {
return array('Group' => array('id' => $data['User']['group_id']));
}
}

Pero el que arroja bake ya trae un $belongsTo:

    ...
    //The Associations below have been created with all possible keys, those that are not needed can be removed
    var $belongsTo = array(
        'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'group_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
        )
    );
    ...

He notado que si dejo ambos, me arroja muchos errores, cual deberia haber dejado?, por lo pronto deje el que crea bake, asi el modelo queda:

        var $name = 'User';
        var $validate = array(
            'username' => array('notempty'),
            'password' => array('notempty'),
            'group_id' => array('numeric')
        );
            var $actsAs = array('Acl' => 'requester');

        //The Associations below have been created with all possible keys, those that are not needed can be removed
        var $belongsTo = array(
            'Group' => array(
                'className' => 'Group',
                'foreignKey' => 'group_id',
                'conditions' => '',
                'fields' => '',
                'order' => ''
            )
        );

        var $hasMany = array(
            'Post' => array(
                'className' => 'Post',
                'foreignKey' => 'user_id',
                'dependent' => false,
                'conditions' => '',
                'fields' => '',
                'order' => '',
                'limit' => '',
                'offset' => '',
                'exclusive' => '',
                'finderQuery' => '',
                'counterQuery' => ''
            )
                );

            function parentNode() {
                if (!$this->id && empty($this->data)) {
                    return null;
                }
                $data = $this->data;
                if (empty($this->data)) {
                    $data = $this->read();
                }
                if (!$data['User']['group_id']) {
                    return null;
                } else {
                    return array('Group' => array('id' => $data['User']['group_id']));
                }
            }

Aqui sigo perdido, tendre que aplicarme con sql mas a fondo.

Luego agrego esto al modelo 'group':

var $actsAs = array('Acl' => array('requester'));
function parentNode() {
     return null;
 }

Aqui me vendria muy bien cualquier explicacion de lo que hacen las funciones parentNode(), y las variables $actAs

7.- Se supone que ahora debo crear algunos grupos y usuarios, asi que agrego los que se senialan en el tutorial, cada uno con un usuario:

  • administrators -> admin
  • managers -> manager
  • users -> user  

Algo curioso es que cada vez que agrego un grupo/usuario obtengo esto, creen que se deba a que no se esta usando rutas (redireccionando)?

Cuando accedo a users/index obtengo esta otra captura:

Y como veo que esta hasheando las contrasenias, supongo que debo ir bien hasta esta parte, el SELECT * FROM aros me da indentico al del tutorial.

El problema era un espacio en blanco al final del archivo app_controller.php -.-'

8.- Agrego una funcion afterSave() al modelo 'user', para sincronizar la tabla 'users' y 'aros', aqui me pregunto porque se tienen que sincronizar?

Porque si no, cada vez que agregaras un usuario, tendrias que agregarlo manualmente a 'aros', de lo contrario no podria accesar a ningun recurso.

9.- Inicializo la tabla ACO:

$ cake acl create aco root controllers

Lo que me crea una entrada como esta en la tabla 'acos'

mysql> select * from acos;
+----+-----------+-------+-------------+-------------+------+------+
| id | parent_id | model | foreign_key | alias       | lft  | rght |
+----+-----------+-------+-------------+-------------+------+------+
|  1 |      NULL | NULL  |        NULL | controllers |    1 |    2 | 
+----+-----------+-------+-------------+-------------+------+------+

Que no entiendo para nada. Y agrego:

$this->Auth->actionPath = 'controllers/';

A la funcion beforeFilter() en app/app_controller.php

Agrega la raiz, como menciono aarkerio, al parecer acl sigue una estructura jerarquica de arbol, de la cual 'controllers' es la raiz, y que tiene como 'id' 1, a partir de ahi, sus ramas 'linkearan' a 1 y las ramas de esas 'linkearan' a sus respectivos ids.

10.- La lleno con los datos de la aplicacion (o eso supongo), para eso corro el script que ahi mismo ponen (http://book.cakephp.org/view/647/An-Automated-tool-for-creating-ACOs)

Lo que al parecer va bien:

Llena la tabla 'acos' con todos los metodos de los controladores., hasta ahora se han llenado 'aros' y 'acos', se sigue jugando sin reglas.

11.- Ahora el tutorial dice que se deben crear los permisos, ya sea con acl (de la cual no tengo la mas remota idea) o con esto:

$this->Acl->allow($aroAlias, $acoAlias);

Que tampoco me lo deja muy claro.

El primer metodo se referia a un script de cake (del cual aun no tengo muy claro su funcionamiento), y este pues a la forma en la que se crean nuevas reglas, ahora que lo pienso es bastante facil, digo mejor esto, que andar buscando dentro de las tablas 'aros', 'acos' para agregar cada entrada a 'aros_acos'

12.- Copio, pego y corro la funcion initDB(), (http://book.cakephp.org/view/648/Setting-up-permissions)

Que se supone me pondra algunas entradas como 1's y 0's, aunque lo que obtengo son -1's y 1.

mysql> select * from aros_acos;
+----+--------+--------+---------+-------+---------+---------+
| id | aro_id | aco_id | _create | _read | _update | _delete |
+----+--------+--------+---------+-------+---------+---------+
| 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | -1 | -1 | -1 | -1 |
| 3 | 2 | 30 | 1 | 1 | 1 | 1 |
| 4 | 2 | 9 | 1 | 1 | 1 | 1 |
| 5 | 3 | 1 | -1 | -1 | -1 | -1 |
| 6 | 3 | 33 | 1 | 1 | 1 | 1 |
| 7 | 3 | 34 | 1 | 1 | 1 | 1 |
| 8 | 3 | 12 | 1 | 1 | 1 | 1 |
| 9 | 3 | 13 | 1 | 1 | 1 | 1 |
+----+--------+--------+---------+-------+---------+---------+

13.- Remuevo los permisos temporales del paso 4 Y agrego:

function beforeFilter() {
parent::beforeFilter();
$this->Auth->allowedActions = array('index', 'view');
}

En los controladores de posts y widgets para sean accesibles a todos los usuarios, tambien agrego esto:

$this->Auth->allowedActions = array('display'); 

a la funcion beforeFilter() en app/app_controller.php

14.- En http://book.cakephp.org/view/649/Logging-in menciona que debemos crear una vista (de nuevo) para la funcion login del controlador 'users', asi que remuevo la anterior y pego esto:

<h2>Login</h2>
<?php
echo $form->create('User', array('url' => array('controller' => 'users', 'action' =>'login')));
echo $form->input('User.username');
echo $form->input('User.password');
echo $form->end('Login');
?>

MMM, al parecer siempre si se requieren las etiquetas de php...

15.- Segun el tutorial los ultimos pasos son agregar la logica a login():

function login() {
if ($this->Session->read('Auth.User')) {
$this->Session->setFlash('You are logged in!');
$this->redirect('/', null, false);
}
}

Y copiar, y modificar app/views/layouts/default.ctp para mostrar una advertencia cuando el login es incorrecto (o eso fue lo que entendi).

Con esto hecho, si voy a user, obtengo este error:

Pero si uso user/login, me deja ver la pantalla:

Cuando me logeo me vuelve a soltar esto:

Y si voy a posts/add me intenta redirigir (o eso creo) a users/login:

Por lo que supongo que esto no esta funcionando..., aclaro que cuando pongo un usuario/contrasenia incorrecto, entonces si me devuelve un cartel en rojo donde me recuerda que estan mal. Hasta el momento a parte de intentarlo varias veces he pedido ayuda con el grupo local de linux y nada, me han sugerido que el tutorial pueda estar mal, porque pese a que no entiendo muchas de las cosas, creo que lo segui lo suficientemente bien, asi que les pregunto, que me puede estar faltando?.

El error salia por un espacio perdido por ahi, pero la aplicacion estaba correcta, al no estar autentificado te redirecciona a login, y el segundo error se referia a ke los permisos no estaban correctamente establecidos, hasta la 5 vez que lo hice me di cuenta de la importancia de crear la primera entrada en 'acos', el que corresponde a 'controllers'

Nota: Perdon por el post kilometrico.

Permalink: http://mononeurona.org/entries/view/chilicuil/1977


Comments Comentblogs:
1.- aarkerio wrote:

Bueno, lo primero que hay que entender es que Auth y Acl son dos componentes diferentes e independientes uno del otro. Auth inicia y guarda los valore de la sesión del usuario y sólo con Auth puedes manejar todos los permisos de tu aplicación sin usar Acl para nada. De hecho Auth puede entenderse como una extensión del componente Session de CakePHP.

Mi consejo es que te olvides un par de semanas de Acl y te concentres sólo en Auth. Auth usa sólo la tabla users y se configura en el método beforeFilter() del archivo APP/app_controller.php. A su vez cada controlador debe tener un método beforeFilter() para ahí indicar que métodos del controlador son públicos y cuales se necesita estar logeado para verlos.

Cuando ya entiendas lo que hace Auth pasas a Acl. Acl crea un árbol de contenidos y se puede decir que grupos tiene permisos a que ramas usando Auth. Pero como te digo, ólvidate de Acl por 15 días.


2009-11-28 09:11:46-06
2.- rnstux wrote:

Yo no he usado ACL, con Auth como dice Aarkerio se puede controlar todo :P.

Manejar Auth es fácilisimo!!

2009-11-28 16:42:36-06
3.- chilicuil wrote:

Ok, gracias por los comentarios, seguire su consejo, me concentrare por lo pronto en Auth, ya les contare como me va.

2009-11-29 20:51:43-06
New Comentblog
Captcha Image
Login




Join us!
Forgot your password?
chilicuil
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GU d-- s+: !a C++(+++) UL++++$B++>$ P+ L+++@ !E(---) W+(++)>$ N++ o? K? !w
O? M? V? !PS PE-- Y+ PGP++ !t 5? !X R* tv-- b+>++ DI? D++@
G++ e>+ h! r- z?
------END GEEK CODE BLOCK------
------ http://tinyurl.com/2tdsv9

$ Sat Jun 5 09:05:03 CDT 2010 $
Powered by
Despabilando la MonoNeurona.org
Livechat
<-Nombre

chilicuil wrote:
Vara, $250 porque puse como pretexto que era estudiante :&#41;, en realidad eran $350
on 21/2/08

aarkerio wrote:
Cuánto te costo el CONSOL?
on 20/2/08

scarecrow wrote:
Bienvenido!
on 18/1/08


checando las quicknews, el de Mechanical Bugs esta barbaro O.o!
6 days, 4 hours ago
@rnstux al final no he podido ir =(, tambien estoy en cama, pasatela xido
2 weeks, 6 days ago
@rnstux ya estas =), ahi nos vemos @chillypsp si aun tienes problemas con tu blog en la MN te puedo ayudar: http://tiny url.com/28vqoxf
4 weeks, 1 day ago
Me es dificil expresar soporte cuando ocurren esas situaciones, pero estoy seguro que sabras que aqu en la MN lo tienes, animo, no hay nada que puedas cambiar ahi, solo toma un tiempo y luego dejalo pasar, mis mas profundas condolencias thot
on 30/7/10
no crei que fueran tantos MNes, gracias una vez rnstux por rifarte el codigo
on 22/6/10
xDDD, jaja, esa si estuvo buena @vendaval
on 16/6/10
estaba*
on 15/6/10
Jajaja, eso mismo esta pensando...
on 15/6/10
@thot: lo mande a Stormy (stormy AT kidsoncomputers DOT org)
on 14/6/10
@thot: el del INEGI?, umm, no, pues a ninguna lado, preguntale a @azimov
on 13/6/10
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2010.