Если вы используете RBAC, вы можете установить 'видимый' параметр элементов CMenu в зависимости от привилегий пользователя, например;
$this->widget('zii.widgets.CMenu',array(
'items'=>array(
array(
'label'=>'Home',
'url'=>array('site/index'),
),
array(
'label'=>'HR',
'url'=>array('/hr/index'),
'visible'=>Yii::app()->user->checkAccess('hr')
),
array(
'label'=>'Accounts',
'url'=>array('/account/index'),
'visible'=>Yii::app()->user->checkAccess('account')
),
array(
'label'=>'Operations',
'url'=>array('/operations/index'),
'visible'=>Yii::app()->user->checkAccess('operations')
),
),
);
Таким образом, пользователи смогут видеть элементы в меню только в том случае, если у них есть права доступа к этой области.
[ИЗМЕНИТЬ]
Согласно комментарию simaremare ниже, вы можете принудительно кэшировать этот запрос за пределы текущего запроса, расширив CWebUser
. Во-первых, настройте своего пользователя для запуска вашего нового класса (мы назовем его TWebUser
), поэтому в вашем конфигурационном файле main.php;
'components'=>array(
'user'=>array(
...
'class'=>'TWebUser',
...
),
...
),
Теперь нам нужно создать TWebUser
для их кэширования помимо текущего запроса (что и делает CWebUser
(исходный код):
class TWebUser extends CWebUser
{
private $_access=array();
public function checkAccess($operation,$params=array(),$allowCaching=true)
{
if($allowCaching && $params===array() && isset($this->_access[$operation]))
return $this->_access[$operation];
$cache = Yii::app()->session['checkAccess'];
if($allowCaching && !$this->getIsGuest() && isset($cache[$operation]) && time() - $cache[$operation]['t'] < 1800)
{
$checkAccess = $cache[$operation]['p'];
} else {
$checkAccess = Yii::app()->getAuthManager()->checkAccess($operation,$this->getId(),$params);
if($allowCaching && !$this->getIsGuest())
{
$access = isset($cache) ? $cache : array();
$access[$operation] = array('p'=>$checkAccess, 't'=>time());
Yii::app()->session['checkAccess'] = $access;
}
}
return $this->_access[$operation] = $checkAccess;
}
}
Теперь ваши результаты доступа будут установлены для всей сессии. Это означает, что если вы отредактируете разрешения RBAC для данной учетной записи, им придется выйти из системы и войти снова, чтобы увидеть новые изменения, отраженные в браузере.
Надеюсь, это поможет! Я уверен, что нашел этот обходной путь от кого-то другого (вероятно, на SO), но я не могу найти исходный пост, чтобы отдать им должное.
person
Stu
schedule
14.09.2012