Баг в RBAC?

Есть следующая иерархия:


  

$auth = new CPhpAuthManager;

        $auth->createOperation('deleteHistory', 'удалять историю');

        $bizRule = 'return in_array($params["email"], $params["branch"]);';

        $task=$auth->createTask('operationWithOwnBranch', 'операции с собственной веткой', $bizRule);

        $task->addChild('deleteHistory');



В экшене контроллера проверяем следующим образом:




$model=new Post;

 if (!Yii::app()->user->checkAccess('deleteHistory', array('branch' => $this->branch, 'email' => 'xxx')))

                Yii::app()->end();

////

$model->save();



И модель сохраняется, несмотря на то что bizRule явно должно проваливаться (email=‘xxx’) и приложение должно останавливаться.

Если изменить код в экшене следующим образом:


$model=new Post;

 if (!Yii::app()->user->checkAccess('operationWithOwnBranch', array('branch' => $this->branch, 'email' => 'xxx')))

                Yii::app()->end();

////

$model->save();

То все работает правильно, модель не сохранятеся, bizRule работают как положено.

Отсюда вывод: bizRule не поднимаются по иерархии вверх, как положено - от операций к заданиям и дальше к ролям. Что я делаю не так, или это действительно баг в RBAC?

А пользователю назначено только "operationWithOwnBranch" или же еще и "deleteHistory" ?

Если второе, то нет разницы что вернет бизнесправило задачи, ведь действие назначено безусловно.

Пользователю Admin назначена операция deleteHistory, а задача operationWithOwnBranch назначена пользователю рангом ниже. Т.е. админу назначено и то, и другое.

Я вот провел эксперимент только что - добавил в операцию deleteHistory напрямую бизнес-правило, и все заработало.


        $auth->createOperation('deleteHistory', 'удалять историю', $bizRule);



Но это ведь не правильно все. Я помню Creocoder и SamDark говорили что бизнес-правила всегда передаются по иерархии вверх, но у меня этой передачи не происходит.

Бизнес правила никуда не передаются, это параметры для них, могут передаваться. Например у операции deleteHistory нет бизнес-правила, но когда делаешь


checkAccess('deleteHistory', array(...))

то указанные параметры попадают в бизнес-правило родительского элемента- задачи operationWithOwnBranch. Заметь, только параметры, а не бизнес-правило.

И свои эксперементы ты проводишь из под админа? Тогда все правильно работает, и проблема в твоем неверном понимании.

Если, к примеру админу назначена и задача(с БП) и операция (без БП) то что происходит при проверки наличия "deleteHistory" с параметрами, при которых правило должно вернуть false? Твои параметры передаются в задачу operationWithOwnBranch, БП возвращает false, и дочерние записи задачи проверяются. Далее проверяется другой элемент присвоенный админу- операция deleteHistory которая не имеет БП, т.е. назначена безусловно, и вся проверка возвращает true независимо от параметров!

Но я могу неверно понимать "задача operationWithOwnBranch назначена пользователю рангом ниже". Не мог бы ты указать код назначения прав именно пользователям, что бы внести ясность? И явно указать из под какого юзера у тебя получается "неожиданное поведение функции checkAccess".

Ну да, не сами бизнес-правила, разумеется, а их параметры.




         $auth->createOperation('deleteHistory', 'удалять историю');


        $bizRule = 'return in_array($params["email"], $params["branch"]);';

        $auth->createTask('operationWithOwnBranch', 'операции с собственной веткой', $bizRule);

        $task->addChild('deleteHistory'); 


 $role = $auth->createRole('editor');

        $role->addChild('operationWithOwnBranch');


 $role = $auth->createRole('admin');

        $role->addChild('editor');

        $role->addChild('deleteHistory');



Ситуация следующая: Пользователь ‘editor’ не должен иметь доступа к операции deleteHistory, в отличии от пользователя admin. Но при этом оба должны удовлетворять задаче operationWithOwnBranch.

Как это реализовать? Я предполагал следующим образом:


 

Yii::app()->user->checkAccess('deleteHistory', array('branch' => $this->branch, 'email' => 'xxx'))

//внутри роли admin должно вернуть false, т.к. bizRule не пройден.



Что значит “админ и редактор должны удовлетворять задаче”? :blink: На неясно поставленное задание не бывает ясного решения.

Третий раз повторюсь, админу БЕЗУСЛОВНО назначена операция deleteHistory которая в свою очередь НЕ ИМЕЕТ БП т.е. БЕЗУСЛОВНА

Все работает верно. Ну как для админа этот checkAccess может вернуть false если админу напрямую назначено deleteHistory (в обход всех БП)?