3

Q:ユーザーの役割ごとに異なるメニューを表示するにはどうすればよいですか?

説明:アプリには多くの役割があります。例:人事マネージャー、アカウントマネージャー、オペレーティングマネージャー、従業員、オペレーター、....など。私は権利とyii-userモジュールを使用してこれらの役割を作成しました。これらの役割にはさまざまな機能があります。そのため、ログイン後、アプリはユーザーの役割ごとに異なるメニューを表示します。これで、ユーザーごとに機能をロックできます。たとえば、HRマネージャーがログインすると、ユーザーロールの他の機能にルーティングできなくなります。しかし、私は人事マネージャーの人事メニューを表示する方法を知りません。

私はyiiの初心者ではありません。しかし、私はそれらのモジュール(rihgtsとyii-user)の初心者です。

4

2 に答える 2

12

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

于 2012-09-14T13:39:38.903 に答える
1

表示したい、または表示したくないメニュー項目の周りにifステートメントをラップします。

ifステートメントでは、ユーザーがメニュー項目を表示する資格があるかどうかをテストする必要があります。

例えば:

<?php if (Yii::app()->user->isGuest): ?>

  <?php $this->widget('zii.widgets.CMenu',array(
    'items'=>array(
  array(
        'label'=>'this menu item visible only for Guests (not logged in)', 
        'url'=>array('/site/index')),
      ),
    )); ?>

<?php endif; ?>
于 2012-09-13T11:20:44.390 に答える