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で)からこの回避策を見つけたと確信していますが、彼らに信用を与えるための元の投稿を見つけることができません。