2015-10-15 16 views
7

Sono in grado di controllare la mia applicazione utilizzando ACL, tutto perfettamente eseguito e l'applicazione funziona senza problemi con ACL e Auth.CakePHP 2.x ACL - Controllo a livello proprietario

Ora il problema è:

Ho due tabelle, users e posts. non c'è RBAC (controllo di accesso basato sui ruoli). Sto impostando deny e allow per ogni utente come segue.

//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'); 

ma qui sto ottenendo un problema:

user2 sta ottenendo l'accesso al edit la posts di user1.

esempio:

User1 creato un post1.

ora User2 clienti registrati ora può modificare postale 's il User1 (cioè post1- /localhost/myApp/posts/edit/1)

Domanda: Come è possibile impostare il permesso ACL a questo problema, Il proprietario del post può modificare solo la posta e gli altri non può.

posso realizzare questo nel livello di controllo semplicemente controllando

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 
} 

ma ho bisogno ACL a lavorare qui, è possibile ?, Aiutaci

Grazie

+0

se è una domanda javascript otterrò risultati immediati, ma sfortuna, questo cakephp. molto male, :( –

+1

non so se funziona bu hai provato qualcosa del genere: '$ this-> Acl-> consenti ($ utente, 'controller/messaggi'/modifica/1)' e così via? – arilia

+0

@ arilia, grazie per il commento l'ho provato, non funziona puoi suggerire altre soluzioni :) –

risposta

3

ecco come avrei fatto

prima di tutto dire a Cake che il modello Post è un ACO

// Post.php model file 
$actsAs = array('Acl' => array('type' => 'controlled')); 

questo modo ogni volta che si crea un nuovo messaggio torta creerà automaticamente un elemento nella tabella acos.

prestare attenzione: dovrete creare manualmente il nodo per i posti creati in precedenza, in questo modo:

// for every Post in your posts table 

$this->Acl->Aco->create(array('alias' => 'Post', 'id' => 123)); 
$this->Acl->Aco->save(); 

poi si deve definire una funzione parentNode() nel file modello Post

// Post.php model file 
public function parentNode() { 
    return null; 
} 

Ora l'ACL handlerer controlla il modulo di autorizzazione solo a livello di azione. In altre parole, controlla solo che sei autorizzato ad accedere all'azione. Quindi richiede altri controlli a livello di controller tramite la funzione isAuthorized().

quindi prima devi impostare l'autorizzazione per ogni nodo

$this->Acl->allow($user, 'controllers/Posts/edit/123') 

poi nel controller che dovete fare

// 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); 
} 

è possibile anche implementare parentNode() per restituire il proprietario di la posta invece di zero

// 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)); 
} 

in questo modo non è necessario impostare il permesso per ogni singolo post perché la torta controllerà se l'utente ha accesso al nodo genitore del Post (che è anche un utente). Quindi, non resta che impostare l'autorizzazione per ogni utente

$this->Acl->allow($user, $user); 

Se si segue questo metodo ricordatevi di impostare l'utente come un ACO troppo

// User.php Model file 

$actsAs = array('Acl' => array('type' => 'both')); 

non ho la prova il codice di cui sopra quindi credo che ci sono anche errori di battitura e errori. Se avrò tempo farò dei test e migliorerò la mia risposta nei prossimi giorni

+0

Grazie, proverò immediatamente, sembra una soluzione decente :) –