2

ZF2 ベースのサイトを開発しています。訪問者/ユーザーのステータスに関係なく、同じメイン ナビゲーションがあります。ユーザーのステータスと役割に応じて、別のコンポーネント/ナビゲーションを追加する必要があります。訪問者の場合、アイテムは

  • 登録
  • ログイン
  • EN (実際にはドロップダウンで、他の利用可能な言語があります)

ログインしている通常のユーザーの場合、表示されます

  • プロフィール
  • ログアウト
  • EN (上記の言語セレクター)

また、特定の役割/権限を持つ一部のユーザーには、追加の項目があります

ACL が肥大化しているように見えるため、RBAC を使用したいと考えています。また、現在ログインしているユーザー/ロールに追加の項目があるかどうかを確認するためだけに、完全な ACL をロードする必要があります (約 15 種類以上の異なるロールを取得しました)。

どうやってこれを達成したかを考えるのに時間を費やしたので、以下にいくつかのアイデアを示します。

  1. 空のナビゲーション コンテナーを作成し、ファクトリを作成します。工場では、認証と RBAC にアクセスし、ユーザーのステータス/ロールに応じてページを追加します。
  2. 可能なすべてのページを含む完全に読み込まれたナビゲーションを作成し、工場で認証と RBAC の助けを借りて、表示したくないページを非表示にします。
  3. rd オプションは、ServiceLayer を介して RBAC を取得し、ナビゲーションを生成するビュー ヘルパーを使用することです。( ZF2 レイアウトでツイートを表示する方法と ZF2で説明したように: テンプレートにログイン ウィジェットを追加します

  4. または、module.php でコントローラー プラグインまたはメソッドのみを作成し、MVC_Render または MVC_Dispatch イベントをリッスンして、目的のナビゲーションを生成し、出力をビュー変数に追加することもできます。

PS: 言語選択セクションに CSS クラスを追加する必要があるため、パーシャルを使用する必要があります。また、ナビゲーションはレイアウトに表示されます。

4

1 に答える 1

3

私はZfcRbacを使用しており、次のように実行しています。ユーザーの役割とナビゲーション項目のアクセス許可に基づいてナビゲーションを次のように表示できます。

最初に、次のようにナビゲーション アイテムにアクセス許可を追加します。

'permission' => 'edit-profile',

onBootstrap次に、次のようにリスナーをアタッチします。

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $eventManager->getSharedManager()->attach(
        'Zend\View\Helper\Navigation\AbstractHelper', 
        'isAllowed', 
        array('\Application\Listener\RbacListener', 'accept')
    );
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

Application\Listener\RbacListener次に、次のようにクラスを作成します。

public function accept(Event $event) { 
    $event->stopPropagation();

    $accepted = true;

    $serviceLocator = $event->getTarget()->getServiceLocator()->getServiceLocator();
    $rbac           = $serviceLocator->get('ZfcRbac\Service\Rbac');

    $params = $event->getParams();
    $page = $params['page'];

    $permission = $page->getPermission();

    if ($permission) {
        $accepted = $rbac->isGranted($permission);
    }

    return $accepted;
}

これにより、メニューを表示すると、権限とロールに基づいてフィルター処理されます。たとえばecho $this->navigation('navigation')->menu()、ユーザーが権限を持つメニュー項目のみが表示されます。

于 2013-09-22T09:13:50.780 に答える