Как использовать поле $data в RBAC?

В документации даже не нашел упоминания про поле $data которое есть в authitem. Следовательно не могу понять как его можно полезно использовать?

Можно ли это поле как-то заюзать для следующей схеме:

есть три операции: editPost, addPost, deletePost

и две задачи: editAllPost, editOwnPost с бизнес правилом


return Yii::app()->user->id ==$params["modelId"];

Все каждой задаче назначены все три операции. Так:

  • editAllPost

[list]

  • editPost

  • addPost

  • deletePost

[*]editOwnPost (bizrule)

  • editPost

  • addPost

  • deletePost

[/list]

В коде делаю одну проверку:


Yii::app()->user->checkAccess("editPost", array('modelId'=>$model->id));

Если пользователю назначена задача "editAllPost" то "modelId" можно было бы и не передавать. А вот если назначено "editOwnPost" то "modelId" обеспечит проверку на авторство.

Считаю это использование бизнес-правила очень правильной, т.к. в РНР коде достаточно проверить наличие только одного токена editPost перенося проверку авторства (если она нужна) на механизм авторизации.

Но есть одно "но", операция "addPost" не должна содержать проверки на авторство. Пользователь с назначенным "editOwnPost" получит false на запрос


Yii::app()->user->checkAccess("addPost");

и что бы этого избежать приходится выносить "addPost" из под "editOwnPost" и это создает путаницу, теперь пользователю недостаточно назначить просто задачу "editOwnPost", ему еще нужно до-назначать операцию дающую право на добавление.

Резюмируя: нужно роли/задачи для управление всеми записями и только своими, но в РНР должно быть достаточно только одной проверки наличия операции на удаление/добавление/редактирование.

У кого есть какие мысли по этому поводу?

В принципе можно для этого использовать $data - этот массив в bizrule доступен.

Например, в addPost добавляем




  $data => array('allow'=>true)



и в bizrule пишем




  return isset($data['allow']) || checkAccessByModelId($params['modelId'])



Огромное спасибо. Что то подобное я и предполагал, но очень нужен был пример.