Despabilando la MonoNeurona::Internet es de todos [Inicio] [Regresar]
Server Side \ El componente Auth
Server Side
El componente Auth

Este artículo ha sido consultado en 348 ocasiones.

<< Venimos de aquí

Routing admin

Routing.admin es una constante que indica que en la aplicación de CakePHP existe una zona "admin" o de administración, esta zona debe ser restringida. Encuentra y descomenta en app/config/core.php la línea que dice:

Configure::write('Routing.admin', 'admin');

Esto quiere decir que puedes ir a una liga como http://localhost/admin/entries/listing donde el controlador es entries_controller.php (nuestro actual controlador) y el método es admin_listing() que usa la vista app/views/entries/admin_listing.ctp. Esto se usa para definir una zona restringida por el componente Auth.

Auth Component

El componente Auth se usa colocándolo en el archivo app/app_controller.php, este archivo es especial: se ejecuta antes de cualquier otro controlador y hereda sus métodos y atributos a todos los demás controladores pues define el Auth en el método beforeFilter, un método de CakePHP que como el nombre lo indica, coloca un filtro previo. Guarda este archivo en app/.

Este archivo importa el componente Auth para toda la aplicaciòn. Es importante hacer notar que estamos usando el email y no el username para hacer el logeo. Las partes más importantes de la configuración de Auth son:

$ this- > Auth->authorize = 'controller';

Esto quiere decir: los permisos son definidos en cada controlador.

$ this- > Auth->deny('*');
Esto es: todas la acciones de todos los controladores están prohibidas a menos de que se diga lo contrario en el controlador. Sólo hay dos acciones que pueden usarse: login() y logout() del controlador users.

Si las indicaciones del componente Auth están colocadas en app_controller.php (como lo acabamos de hacer) significa que cada uno de nuestros controladores necesitan dos métodos extras, el método beforeFilter() y el método isAuthorized().

public function beforeFilter()
{
$this->Auth->allow(array('display', 'view')); // es decir que todo mundo puede ejecutar los métodos display y view de este controlador
parent::beforeFilter();
}

public function isAuthorized()
{
if (isset( $this->params[Configure::read('Routing.admin')] )) // si estoy en la zona admin
{
if ( $this->Auth->user('id') == 1 ) // si soy el usuario con el id 1
{
return true; // Welcome!
}
}
return false; // go away !!
}

$this->Auth->allow(array('display', 'view')) del método beforeFilter() define en cada controlador que acciones están disponibles sin seguridad, en este caso display y view son accesibles a cualquiera que llegué a nuestro sitio. El método isAuthorized sirve para restringir la zona admin del blog.

Necesitamos el controlador 'users' para manejar el login y el logout de nuestro blog:

< ?
//archivo: app/controllers/users_controller.php
class UsersController extends AppController {

public function login()
{
$this ->layout = 'portal';
}

public function logout()
{

}
}
?>

Necesitamos una vista para el formulario de logeo:

//archivo: app/views/users/login.ctp
< ?
echo $form->create('User', array('controller' => 'users', 'action' => 'login'));
echo $form->input('email');
echo $form->input('pwd');
echo $form->end('Login');
?>

Nos colocamos en http://localhost/users/login y debemos ver el formulario de logeo. Si escribimos nuestro correo y password debemos entrar como usuarios al blog. En nuestro layout portal.ctp tenemos una parte quer dice:

if ( isset( $cU['User'] ) )

Este array $cU es colocado en las vistas y layouts por app_controller.php siempre y cuando el usuario este logeado. Es decir que siempre tendrás este array disponible en las vistas si quieres mostrar o conocer la información de un usuario. En los controladores usarás el componente Auth así para ir por información del usuario:

$ this -> Auth->user('username'); // para el username
$ this -> Auth->user('id'); // para el user_id

Necesitamos agregar varios métodos de la sección de administración al controlador entries:

/** ==== ADMIN METHODS ====*/
public function admin_listing()
{
$this->layout = 'admin';

$conditions = array("Entry.user_id"=>$this->Auth->user('id'));

$fields = null;

$limit = 20;

$this->set('data', $this->Entry->findAll($conditions, $fields, $order, $limit));
}

public function admin_add()
{
$this->layout = 'admin';

$this->set('thems', Set::combine($this->Entry->Theme->find('all', array('order' => 'title')), "{n}.Theme.id","{n}.Theme.title"));

if ( !empty($this->data["Entry"]) )
{
$this->Sanitize = new Sanitize;

$this->Sanitize->paranoid($this->data["Entry"]["title"]); // antihacker

$this->Sanitize->html($this->data["Entry"]["body"]); // antihacker

$this->Entry->create(); // prepara el query

if ($this->Entry->save($this->data["Entry"]))
{
$this->flash('Story added', '/admin/entries/listing');
}
}
}
public function admin_delete($id)
{
if ( $this->Entry->del($id) )
{
$this->msgFlash('The entry has been deleted.', '/admin/entries/listing');
}
}

Como se ve es necesario tener un layout app/views/layouts/admin.ctp para usarlo en la sección admin.

El método admin_listing requiere de la vista app/views/entries/admin_listing.ctp, el ,étodo admin_add de la vista  app/views/entries/admin_add.ctp, etcétera.


Observaciones finales: Una buena aplicación debe tener la lógica en el modelo y no el controlador. No se deben re-declarar las asociaciones, es decir si en el modelo User se tiene hasMany Entry, en Entry no se debe poner belongsTo->User.


Última actualización: 2008-03-31 16:07:35-06



ir arriba
The Queen is here Mozilla Firefox The Best DataBase CakePHP Framework CSS GNU Hacker