Yii-rights — это оболочка для стандартного yii-rbac. В модуле прав у вас есть веб-интерфейс для вашего RBAC. При создании AuthItem (Операция в веб-интерфейсе с правами) вы можете определить свой собственный bizrule.
Вот код для создания AuthItem:
$item = $this->_authorizer->createAuthItem($formModel->name, $type, $formModel->description, $formModel->bizRule, $formModel->data);
$item = $this->_authorizer->attachAuthItemBehavior($item);
_authorizer
вот пример класса RAuthorizer. Затем мы переходим к RDbAuthManager, который расширяет CDbAuthManager, где мы создаем функцию AuthItem:
public function createAuthItem($name,$type,$description='',$bizRule=null,$data=null)
{
$this->db->createCommand()
->insert($this->itemTable, array(
'name'=>$name,
'type'=>$type,
'description'=>$description,
'bizrule'=>$bizRule,
'data'=>serialize($data)
));
return new CAuthItem($this,$name,$type,$description,$bizRule,$data);
}
Вот как создается AuthItem, в правах. Лично я предпочитаю использовать веб-интерфейс. У него много отличных возможностей, и с ним гораздо проще обращаться, чем каждый раз переходить к коду.
Затем, когда мы выполняем checkAccess()
для AuthItem, мы вызываем execute bizRule:
public function executeBizRule($bizRule,$params,$data)
{
return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval($bizRule)!=0 : @eval($bizRule)!=0);
}
Так работает RBAC в yii, а права — это просто крутая обертка для него. Права не меняют логику того, как что-то должно быть сделано.
Итак, в базовом yii-rbac, если вы хотите разрешить обновление только собственных записей, вы делаете:
$bizRule='return Yii::app()->user->id==$params["user"]->username;';
$task=$auth->createTask('updateOwnUser','update a your own account',$bizRule);
$task->addChild('updateUser');
Затем вы называете это так:
$user=$this->loadUser();
$params = array('user' => $user);
if(Yii::app()->user->checkAccess('updateOwnUser', $params){
..................
}
В правах это уже реализовано с фильтрами. Единственное, что вам нужно сделать, это добавить в свой контроллер:
class MyController extends RController{
.............
public function filters()
{
return array(
'rights',
............
);
}
.............
}
Так что определите свой bizrule для элемента в веб-интерфейсе, измените код вашего контроллера, и на самом деле это все. Чтобы узнать, какие переменные использовать в bizrule, вы можете посмотреть код RightsFilter.php, где выполняется checkAccess().
И вдобавок ко всему этому я скажу о том, как работает checkAccess():
Для каждого назначенного элемента аутентификации пользователя он сначала проверяет, возвращает ли bizRule для назначения значение true.
Если true, вызывается метод checkAccess элемента. Если bizRule элемента возвращает значение true,
2.1. Если имя элемента совпадает с именем, переданным в исходном методе checkAccess(), он возвращает значение true;
2.2. В противном случае для каждого дочернего элемента он вызывает свой checkAccess.
Надеюсь, это прояснит некоторые аспекты RBAC и поможет в вашей задаче.
person
ineersa
schedule
22.08.2013