2015-10-15 55 views
7

Jestem w stanie kontrolować moją aplikację za pomocą ACL, wszystko jest wykonane idealnie i aplikacja działa sprawnie z ACL i Auth.CakePHP 2.x ACL - Kontrola na poziomie właściciela

Teraz problem jest:

Mam dwie tabele, users i posts. nie ma RBAC (kontrola dostępu oparta na rolach). Ustawiam deny i allow dla każdego użytkownika, jak na przykład.

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

ale tutaj jestem coraz jeden problem:

user2 jest uzyskanie dostępu do editposts z user1.

przykład:

User1 stworzył post1.

teraz User2 zalogowany teraz on może edytować posta User1 „s (tj post1- /localhost/myApp/posts/edit/1)

Pytanie: W jaki sposób można ustawić uprawnienia ACL do tego problemu, właściciel słupka może edytować tylko słupek i inni nie może.

można to osiągnąć na poziomie kontroler wystarczy zaznaczyć

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 
} 

ale muszę ACL tu pracować, Czy to możliwe ?, Proszę o pomoc

Dzięki

+0

jeśli jest to javascriptowe pytanie, otrzymam natychmiastowe wyniki, ale mój pech, ten cacephp. bardzo źle, :( –

+1

nie wiesz, czy działa bu, czy próbowałeś coś w stylu: '$ this-> Acl-> allow ($ user, 'controllers/Posts'/edit/1)' an tak na? – arilia

+0

@ ariula, dziękuję za komentowanie, próbowałem, nie działa, możesz zaproponować inne rozwiązania :) –

Odpowiedz

3

oto jak to zrobić

Przede wszystkim powiedz Cake, że model Post to ACO

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

w ten sposób za każdym razem, gdy utworzysz nowy post-post, automatycznie utworzy element w tabeli acos.

czujność: będziesz musiał ręcznie utworzyć węzeł wcześniej utworzonych stanowisk, w ten sposób:

// for every Post in your posts table 

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

potem trzeba zdefiniować parentNode() funkcji w pliku modelu post

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

Teraz uprawnienie do sprawdzania formularza autoryzacji ACL tylko na poziomie działania. Innymi słowy, po prostu sprawdza, czy masz dostęp do akcji. Następnie wymaga innych kontroli na poziomie kontrolera przez funkcję isAuthorized().

więc najpierw trzeba ustawić uprawnienia dla każdego węzła

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

następnie w kontrolerze trzeba zrobić

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

można również realizować parentNode() do powrotu właściciela Poczta zamiast o wartości nieulotnej:

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

w ten sposób nie trzeba ustawiać uprawnienia dla każdego postu, ponieważ ciastko sprawdzi, czy użytkownik ma dostęp do węzła nadrzędnego Posta (który również jest użytkownikiem). Więc po prostu trzeba ustawić uprawnienia dla każdego użytkownika

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

Jeśli zastosujemy ten sposób zapamiętać ustawienia użytkownika jako ACO zbyt

// User.php Model file 

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

nie przetestować kod powyżej, więc myślę, że jest też wiele literówek i błędów. Jeśli mam czas, zrobię kilka testów i poprawię swoją odpowiedź w następnych dniach

+0

Dzięki, spróbuję tego od razu, Wygląda na przyzwoite rozwiązanie :) –