2011-03-19 13 views
5

Soy bastante nuevo en el uso de CakePHP pero ya estoy resultando increíblemente útil para el rápido desarrollo de aplicaciones web.¿Cómo puedo restringir cierto contenido en CakePHP?

Sin embargo, me preguntaba si hay una manera de restringir el acceso a ciertos objetos de una manera no estándar. Por ejemplo, si tuviera que crear un solo sistema CMS, los usuarios pueden crear un "sitio", ¿cómo puedo afirmar que los usuarios (múltiples) tienen acceso a ese sitio en particular?

Pude comprobar esto en el controlador de mi sitio, pero debería verificarlo para cada uno de los controladores de mi sitio, por ejemplo, necesitaría comprobar que la página actual, las noticias, los contactos, los archivos, etc. que se están editando pertenecen a el ID del sitio y el usuario tiene acceso para editarlo?

es decir, thecms.com/pages/edit/123 (¿cómo puedo estar seguro de usuario 9 puede editar la página 123 que pertenece al sitio 2)

Asumo esto es fuera de lo que puede ofrecer como ACL son específicos de la entidad. ¿Hay alguna manera fácil de hacer esto?

Respuesta

5

Supongo que ya conoce el componente Auth y ACL de CakePHP, que puede proporcionar formas de restringir el contenido. Pero también es cierto lo que dices: que la ACL de CakePHP es "específica de la entidad" y no la mejor opción para una base "por registro" (por ejemplo, el usuario 3 no debe acceder al artículo 7). Entonces propongo este código; probarlo y quiero saber:

Dentro de la aplicación/app_controller.php archivo:

<?php 
class AppController extends Controller { 
    function checkPermission($aro, $aco, $loggedUserRole = 'User') { 
     if ($loggedUserRole != 'Admin') { 
      $permission = ($aro == $aco); 
      if (!$permission) { 
       $this->Session->setFlash('You cannot access that.'); 
       $this->redirect('/somewhere'); 
      } 
     } 
    } 
} 

Luego, dentro de la acción que desea restringir, poner:

$this->checkPermission($this->Auth->user('id'), $someId, $this->Auth->user('role')); 

Por lo tanto, la La función checkPermission() hace lo siguiente:

Cuando se invoca, se pasa una identificación para el usuario que se desea autorizar, una identificación de aquello a lo que el usuario intenta acceder y también un rol (por lo que se asume en hay una columna de 'Rol' dentro de la tabla de usuarios; también, $this->Auth->user('id') significa los datos de sesión del usuario almacenados automáticamente por el componente Auth). El método checkPermission() comprueba si el rol pasado es no administrador (suponiendo que haya administradores que tendrán acceso a todos), y luego verifica la igualdad de los parámetros $ aro y $ aco. Si no, redirige a un lugar con un mensaje de "prohibido".

Ahora, el parámetro $ aco puede ser una variedad de cosas. Por ejemplo, supongamos que está haciendo una función para editar una cuenta de usuario, que toma un argumento de $ userId. Entonces, compara el ID del usuario conectado (desde $this->Auth->user('id')) con el ID de usuario $ pasado. Si no es igual, significa que el usuario conectado no debe editar ese registro de usuario.

Otro ejemplo: Tiene una acción para eliminar un artículo, que acepta un argumento $ articleId. Puede recuperar el artículo de la base de datos y luego pasar el valor user_id del artículo como $ aco, antes de borrar el artículo. De nuevo, el usuario conectado sería expulsado si tal user_id no es él.

Espero que esta solución le sirva bien.

+0

Excelente respuesta, gracias! –

+0

De nada. – YOMorales

Cuestiones relacionadas