CakePHP 2.x ACL-Control a nivel de propietario
(1)
así es como lo haría
en primer lugar, decirle a Cake que el modelo Post
es un ACO
// Post.php model file
$actsAs = array(''Acl'' => array(''type'' => ''controlled''));
De esta forma, cada vez que creas una nueva torta de publicación creará automáticamente un elemento en la tabla acos
.
preste atención: deberá crear manualmente el nodo para las publicaciones previamente creadas, de esta manera:
// for every Post in your posts table
$this->Acl->Aco->create(array(''alias'' => ''Post'', ''id'' => 123));
$this->Acl->Aco->save();
luego debe definir una función parentNode()
en su archivo de modelo de publicación
// Post.php model file
public function parentNode() {
return null;
}
Ahora el controlador de autenticación de ACL verifica el permiso de forma solo a nivel de acción. En otras palabras, solo verifica que se te permite acceder a la acción. Luego exige otras comprobaciones a nivel de controlador mediante la función isAuthorized()
.
entonces primero debes establecer el permiso para cada nodo
$this->Acl->allow($user, ''controllers/Posts/edit/123'')
entonces en tu controlador tienes que hacer
// PostsController.php
public function isAuthorized($user = null) {
if ($this->request->action === ''edit'') {
$user = // retrieve the user array. i.e. from Session
$post_id = $this->request->$this->request->pass[0];
$post = array(''alias'' => ''Post'', ''id'' => $post_id );
return this->Acl->check($user, $post);
}
return parent::isAuthorized($user);
}
también puede implementar la función parentNode () para devolver el propietario del mensaje en lugar de nulo
// Post.php model file
// just an hint, the actual code should be
// a bit more complex
public function parentNode() {
$user_id = $this->field(''user_id'');
return array(''User'' => array(''id'' => $user_id));
}
de esta forma, no es necesario establecer el permiso para cada publicación porque Cake verificará si el usuario tiene acceso al nodo primario de la publicación (que también es usuario). Entonces solo debes establecer el permiso para cada usuario
$this->Acl->allow($user, $user);
Si sigues este método, recuerda configurar al ACO también
// User.php Model file
$actsAs = array(''Acl'' => array(''type'' => ''both''));
No probé el código anterior, así que supongo que también hay muchos errores tipográficos. Si tengo tiempo, haré algunas pruebas y mejoraré mi respuesta en los próximos días
Puedo controlar mi aplicación usando ACL
, todo se hace perfectamente y la aplicación funciona sin problemas con ACL
y Auth
.
Ahora el problema es:
Tengo dos tablas, users
y posts
. no hay RBAC
(control de acceso basado en roles). Estoy estableciendo deny
y allow
a cada usuario seguir.
//allow User1 to do everything
$user->id=1;
$this->ACL->allow($user,''controllers'');
//allow User2 to add, edit and view the posts
$user->id=2;
$this->Acl->deny($user, ''controllers'');
$this->Acl->allow($user, ''controllers/Posts'');
pero aquí tengo un problema:
user2
está obteniendo acceso para edit
las posts
de user1
.
ejemplo:
User1
creó una post1
.
ahora el User2
sesión ahora puede editar la publicación del User1
(es decir, post1- /localhost/myApp/posts/edit/1
)
Pregunta: ¿Cómo puedo configurar el permiso de ACL para este problema? El propietario de la publicación solo puede editar la publicación y otros no.
Puedo lograr esto en el nivel del controlador simplemente comprobando
if($_SESSION[''Auth''][''User''][''id''] == $Post[''Post''][''user_id'']){
// you''re the owner, so u can edit
}else{
//u cant edit, this is not ur post
}
pero necesito ACL
para trabajar aquí, ¿es posible ?, por favor ayuda
Gracias