2015-10-15 55 views
7

我能夠使用ACL控制我的應用程序,所有任務都完美完成,應用程序運行平穩,其中ACLAuthCakePHP 2.x ACL - 在所有者級別的控制

現在的問題是:

我有兩個表,usersposts。沒有RBAC(基於角色的訪問控制)。 對於每個用戶,我正在設置denyallow,如下所示。

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

但在這裏,我得到一個問題:

user2越來越以edituser1posts訪問。

例如:

User1創建的post1

現在User2登錄現在他可以編輯User1的帖子(即post1- /localhost/myApp/posts/edit/1

問:我如何設置ACL權限這一問題,後期的所有者只能編輯文章和其他不能。

我可以在控制器級別?只需勾選

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 
} 

做到這一點,但我需要ACL在這裏工作,是否有可能?請幫

感謝

+0

如果它的javascript問題,我會立即得到結果,但我運氣不好,這個cakephp。非常糟糕,:( –

+1

不知道它是否工作不知道你是否試過類似這樣的想法:'$ this-> Acl-> allow($ user,'controllers/Posts'/ edit/1)'等等? – arilia

+0

@ arilia,感謝評論我試了一下,不工作,你可以建議任何其他的解決方案:) –

回答

3

這裏是我會怎麼做

首先告訴Cake Post型號是ACO

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

這樣每次您創建一個新的發佈蛋糕時,會自動在acos表中創建一個項目。

注意:你必須手動創建先前創建的帖子節點,這種方式:

// for every Post in your posts table 

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

,那麼你必須在你的日誌模型文件中定義parentNode()功能

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

現在ACL驗證處理程序僅在操作級別檢查表單權限。換句話說,它只是檢查您是否被允許訪問該操作。然後它需要通過isAuthorized()函數在控制器級別進行其他檢查。

所以首先要設置權限爲每個節點

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

然後在你的控制器,你所要做的

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

還可以實現parentNode()函數返回的所有者Post而不是null

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

這樣就不必設置權限因爲cake會檢查用戶是否可以訪問Post的父節點(誰也是用戶)。所以,你只需要如果按照這個方法,記得設置根據用戶的ACO太

// User.php Model file 

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

我沒有測試上面,所以我想這裏的代碼,設置權限爲每個用戶

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

也有很多錯別字和錯誤。如果我有時間,我會做一些測試,並在接下來的幾天裏改進我的答案

+0

謝謝,我會立即嘗試,看起來像體面的解決方案:) –