Yii-права параметры/данные для bizrule

Сценарий:

Использование модуля Yii-rights + Yii-user в моем проекте. В правах я сгенерировал операции на основе своего действия контроллера, в разделе обновления я добавил дочерний элемент UpdateOwn.

Для UpdateOwn bizrule предполагает простое сравнение того, что идентификатор вошедшего в систему пользователя равен полю $model->user_id.

Проблема:

Я понимаю, что yii checkaccess позволяет вам передавать переменные в качестве параметров и сравнивать их с вашим определенным bizrule. Но как это работает для модуля прав Yii? Как или какие данные/параметры передаются для использования в bizrule? Как я могу определить или передать свои собственные данные/параметры?


person Godzilla    schedule 18.08.2013    source источник


Ответы (2)


Модуль yii-rights имеет следующие свойства:

/**
* @property boolean whether to enable business rules.
*/
public $enableBizRule = true;

/**
* @property boolean whether to enable data for business rules.
*/
public $enableBizRuleData = false;

Чтобы установить данные bizrule через веб-интерфейс, вы должны установить $enableBizRuleData = true в конфигурации вашего приложения.

Обратите внимание, что пользовательский интерфейс ограничен, и вы можете задавать данные только для Auth-Items, но не для Auth-Assignments. Также значение для data должно быть сериализованной переменной PHP.

Как уже упоминалось @ineersa, вы можете получить доступ к $data в несериализованной форме в своем bizRule.

Также стоит отметить, что Yii сначала проверяет bizRule для Auth-Item, а затем дополнительно для Auth-Assignment.

[править] добавлен пример

Элемент авторизации

bizRule

Проверьте, есть ли в назначении все ключи, указанные в данных элемента.

return BizRule::compareKeys($params, $data, 'Editor');

данные

a:1:{s:8:"language";b:1;}

Назначение аутентификации

Проверьте, соответствует ли язык приложения данным назначения

bizRule

return BizRule::compareApplicationLanguage($params, $data);

данные

a:1:{s:8:"language";s:5:"de_de";}

[править] добавлена ​​ссылка на код

Вот полный вспомогательный код.

person schmunk    schedule 28.08.2013
comment
Итак, если мне нужно значение, скажем, из модели, будет лучше, если я просто сделаю это в PHP, а не в пользовательском интерфейсе модуля? - person Godzilla; 29.08.2013
comment
Вы можете сделать и то, и другое, просто передайте модель (значение) в качестве параметра. Я только что создал статический помощник, потому что не хотел иметь длинный код в своей базе данных, и я обнаружил, что он также более стабилен, когда дело доходит до обновлений или дополнений логики правил. - person schmunk; 29.08.2013
comment
Если вы планируете использовать RController для автоматического применения rights через фильтр, то, используя предложение @schmunk, вы находитесь в лучшем положении, чтобы использовать вспомогательный класс с методом static. Обратите внимание, что в этом случае ваш фильтр запускается до выполнения вашего действия, поэтому $model недоступен. Но вы можете использовать Yii::app()->request->getParam('myparam') в своем bizRule, чтобы получить любые параметры запроса, которые вы используете для загрузки вашего $model. bizRule="return(User::isOwner($params, $data, Yii::app()->request->getParam('id')));" .. public static function isOwner($params, $data, $userId) { .. } - person visitsb; 18.09.2014

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():

  1. Для каждого назначенного элемента аутентификации пользователя он сначала проверяет, возвращает ли bizRule для назначения значение true.

  2. Если true, вызывается метод checkAccess элемента. Если bizRule элемента возвращает значение true,

2.1. Если имя элемента совпадает с именем, переданным в исходном методе checkAccess(), он возвращает значение true;

2.2. В противном случае для каждого дочернего элемента он вызывает свой checkAccess.

Надеюсь, это прояснит некоторые аспекты RBAC и поможет в вашей задаче.

person ineersa    schedule 22.08.2013
comment
В RightsFilter.php строка if( $user-›checkAccess($authItem)!==true ) ничего не передает в параметры, как мне определить, какие данные доступны мне для сравнения, используя Права на веб-интерфейс Bizrule? - person Godzilla; 24.08.2013
comment
Я только что понял, что при создании нового authItem есть поле данных. Что я могу ввести в это поле? Например. Я добавляю Post.UpdateOwn в качестве дочернего элемента Post.Update, мне нужно будет добавить данные из Post Model, чтобы выполнить сравнение в Bizrule, как я могу это сделать? - person Godzilla; 24.08.2013