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.
Excelente respuesta, gracias! –
De nada. – YOMorales