2015-10-15 1 views
7

Я могу контролировать свое приложение с помощью ACL, все сделано отлично, и приложение работает плавно с ACL и Auth.CakePHP 2.x ACL - Контроль на уровне владельца

Теперь проблема:

У меня есть две таблицы, users и posts. RBAC (управление доступом на основе ролей). Я устанавливаю deny и allow для каждого пользователя, например, следуйте инструкциям.

//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 является получение доступа к editposts из user1.

пример:

User1 создал post1.

Теперь User2 вошли в систему, он может редактировать сообщение The User1 «s (т.е. 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, я получу немедленные результаты, но моя неудача, этот трюк. очень плохо, :( –

+1

Не уверен, что если он работает, вы попробовали что-то вроде: '$ this-> Acl-> allow ($ user, 'controllers/Posts'/edit/1)' an so on? – arilia

+0

@ arilia, спасибо за комментарий, я попробовал, не работаю, вы можете предложить любые другие решения :) –

ответ

3

вот как я бы сделал

Прежде всего скажите торт 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

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

Теперь обработчик auth-обработчика 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.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)); 
} 

таким образом не нужно устанавливать разрешение для каждой отдельной записи, потому что торт проверяет, имеет ли пользователь доступ к родительскому узлу Почты (кто тоже пользователь). Таким образом, вы просто должны установить разрешение для каждого пользователя

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

Если вы будете следовать этим методом, не забудьте указать пользователя как ACO слишком

// User.php Model file 

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

Я не проверял код, приведенный выше, так что я предполагаю, что есть много опечаток и ошибок тоже. Если у меня есть время, я сделаю некоторые тесты и улучшу свой ответ в следующие дни.

+0

Спасибо, я попробую это сразу, Похоже на достойное решение :) –

 Смежные вопросы

  • Нет связанных вопросов^_^