То все работает правильно, модель не сохранятеся, bizRule работают как положено.
Отсюда вывод: bizRule не поднимаются по иерархии вверх, как положено - от операций к заданиям и дальше к ролям. Что я делаю не так, или это действительно баг в RBAC?
Пользователю Admin назначена операция deleteHistory, а задача operationWithOwnBranch назначена пользователю рангом ниже. Т.е. админу назначено и то, и другое.
Я вот провел эксперимент только что - добавил в операцию deleteHistory напрямую бизнес-правило, и все заработало.
Но это ведь не правильно все. Я помню Creocoder и SamDark говорили что бизнес-правила всегда передаются по иерархии вверх, но у меня этой передачи не происходит.
Бизнес правила никуда не передаются, это параметры для них, могут передаваться. Например у операции deleteHistory нет бизнес-правила, но когда делаешь
checkAccess('deleteHistory', array(...))
то указанные параметры попадают в бизнес-правило родительского элемента- задачи operationWithOwnBranch. Заметь, только параметры, а не бизнес-правило.
И свои эксперементы ты проводишь из под админа? Тогда все правильно работает, и проблема в твоем неверном понимании.
Если, к примеру админу назначена и задача(с БП) и операция (без БП) то что происходит при проверки наличия "deleteHistory" с параметрами, при которых правило должно вернуть false? Твои параметры передаются в задачу operationWithOwnBranch, БП возвращает false, и дочерние записи задачи проверяются. Далее проверяется другой элемент присвоенный админу- операция deleteHistory которая не имеет БП, т.е. назначена безусловно, и вся проверка возвращает true независимо от параметров!
Но я могу неверно понимать "задача operationWithOwnBranch назначена пользователю рангом ниже". Не мог бы ты указать код назначения прав именно пользователям, что бы внести ясность? И явно указать из под какого юзера у тебя получается "неожиданное поведение функции checkAccess".
Ситуация следующая: Пользователь ‘editor’ не должен иметь доступа к операции deleteHistory, в отличии от пользователя admin. Но при этом оба должны удовлетворять задаче operationWithOwnBranch.
Как это реализовать? Я предполагал следующим образом:
Yii::app()->user->checkAccess('deleteHistory', array('branch' => $this->branch, 'email' => 'xxx'))
//внутри роли admin должно вернуть false, т.к. bizRule не пройден.