インストール
composer require 'drupal/menu_per_role:8.x-1.8'
composer require 'drupal/menu_per_role:8.x-1.6'
概要
Menu Per Roleは、Drupalのメニュー項目の表示/非表示をユーザーロールに基づいて制御するためのモジュールです。特定のロールにのみメニュー項目を表示したり、特定のロールからメニュー項目を非表示にしたりすることができます。
このモジュールは、メニューリンクコンテンツエンティティ(コンテンツエンティティとして保存されるメニューリンク)に対してのみ機能します。設定ファイル(Viewsの設定など)や *.links.menu.yml ファイルで提供されるメニューリンクは、このモジュールでは管理できません。
アクセス制御の仕組みとして、メニュー項目の編集画面に2つのフィールドセットが追加されます。「表示するロール」を設定すると、選択したロールのみがメニュー項目を見ることができます。「非表示にするロール」を設定すると、選択したロールはメニュー項目を見ることができなくなります。両方の設定を組み合わせることも可能です。何もロールを選択しない場合は、デフォルトのアクセス権限が維持されます。
管理者ロールやUID 1のユーザーに対しては、フロントエンドと管理画面それぞれでアクセスチェックをバイパスするかどうかを個別に設定できます。これにより、管理者がすべてのメニュー項目を確認できるようにしながら、一般ユーザーには適切なアクセス制御を適用することが可能です。
Features
- メニュー項目ごとに表示を許可するロールを設定(ホワイトリスト方式)
- メニュー項目ごとに非表示にするロールを設定(ブラックリスト方式)
- 表示ロールと非表示ロールを組み合わせた複合的なアクセス制御
- 管理者ロール(UID 1および管理者ロール)のアクセスチェックバイパス設定
- フロントエンドと管理画面で個別のバイパス設定
- Node Accessモジュール使用時のメニュー項目フィールド表示制御
- カスタムキャッシュコンテキスト(route.is_admin)によるパフォーマンス最適化
Use Cases
会員専用メニューの作成
Eコマースサイトや会員制サイトで、会員登録済みユーザーのみが見られるメニュー項目を作成できます。例えば、「会員専用ページ」「マイアカウント」「注文履歴」などのメニュー項目を作成し、「表示するロール」に「認証済みユーザー」や「会員」ロールを設定します。匿名ユーザーにはこれらのメニュー項目が表示されなくなります。
管理者向けメニューの非表示化
一般ユーザーには見せたくないが、管理者だけがアクセスできるメニュー項目を設定できます。「管理者ツール」などのメニュー項目を作成し、「表示するロール」に「管理者」ロールのみを設定します。これにより、通常のコンテンツ閲覧者にはメニューが表示されません。
匿名ユーザー向けメニューの作成
ログインしていないユーザーにのみ表示するメニュー項目を作成できます。例えば、「新規登録」「ログイン」などのメニュー項目を作成し、「表示するロール」に「匿名ユーザー」を設定します。ログイン後はこれらのメニュー項目が自動的に非表示になります。
部門別ナビゲーションの実装
企業のイントラネットサイトで、部門ごとに異なるメニュー構造を表示できます。「営業部」「開発部」「人事部」などのロールを作成し、各部門専用のメニュー項目に対応するロールを「表示するロール」に設定します。ユーザーは自分が所属する部門のメニューのみを見ることができます。
特定ロールからメニューを隠す
特定のユーザーグループからメニュー項目を隠す必要がある場合に使用します。例えば、サブスクリプションの無料プランユーザーに「プレミアム機能」メニューを表示したくない場合、「非表示にするロール」に「無料プラン」ロールを設定します。有料プランにアップグレードすると自動的にメニューが表示されるようになります。
Node Accessとの併用
Node Accessモジュールを使用してコンテンツのアクセス制御を行っているサイトで、Menu Per Roleによる重複した設定を避けられます。モジュール設定で「コンテンツを参照するメニュー項目でフィールドを表示」を「Node Accessモジュールが有効でない場合のみ」または「表示しない」に設定することで、コンテンツへのリンクはNode Accessの設定に従い、カスタムリンクやビューページへのリンクのみMenu Per Roleで制御できます。
Tips
- メニュー項目のロール設定を変更した後は、キャッシュをクリアして変更が反映されることを確認してください
- 複雑なアクセス制御が必要な場合は、「表示するロール」と「非表示にするロール」を組み合わせて使用できます。表示ロールで許可されたユーザーの中から、非表示ロールに該当するユーザーを除外する動作になります
- 開発環境では管理者バイパスを有効にしておくと、すべてのメニュー項目を確認しながら作業できます
- 本番環境では、フロントエンドの管理者バイパスを無効にして、管理者でも一般ユーザーと同じ表示を確認できるようにすることを検討してください
- Node Accessモジュールと併用する場合は、アクセス制御の重複を避けるため、コンテンツリンクではMenu Per Roleのフィールドを非表示にする設定を検討してください
Technical Details
Admin Pages 1
/admin/config/system/menu_per_role
Menu Per Roleモジュールのグローバル設定を行う画面です。管理者ロールのアクセスチェックバイパス設定、メニュー項目編集時に表示するフィールドの選択、コンテンツを参照するメニュー項目でのフィールド表示設定を管理できます。
権限 3
Hooks 3
hook_help
ヘルプページ(/admin/help/menu_per_role)に表示されるモジュールのヘルプテキストを提供します。
hook_entity_base_field_info
menu_link_contentエンティティタイプに2つのベースフィールドを追加します。menu_per_role__show_role(表示するロール)とmenu_per_role__hide_role(非表示にするロール)フィールドで、どちらもuser_roleエンティティへの複数参照フィールドです。
hook_form_FORM_ID_alter (menu_link_content_form)
メニューリンクコンテンツの編集フォームをアルターし、設定に基づいてshow_roleとhide_roleフィールドの表示/非表示を制御します。「表示のみ」「非表示のみ」の設定や、Node Accessモジュール使用時のフィールド非表示などの条件を処理します。
Troubleshooting 5
Menu Per Roleはコンテンツエンティティとして保存されるメニューリンク(menu_link_content)のみをサポートしています。設定ファイル(Views、*.links.menu.ymlファイル)で提供されるメニューリンクは対象外です。これらのメニューに対してアクセス制御が必要な場合は、メニューリンクを手動で作成するか、別のアクセス制御方法を検討してください。
「管理」>「環境設定」>「システム」>「Menu Per Role」で、「Administrator role bypass access check」の設定を確認してください。フロントエンドと管理画面それぞれで、管理者のバイパス設定が個別に行えます。
Drupalのキャッシュをクリアしてください。Menu Per Roleはキャッシュコンテキストを使用しているため、設定変更後はキャッシュのリビルドが必要な場合があります。
モジュール設定で「Select what is shown when editing menu items」の設定を確認してください。「Only Hide check boxes」または「Only Show check boxes」が選択されている場合、片方のフィールドのみが表示されます。両方表示したい場合は「Hide and Show check boxes」を選択してください。
モジュール設定の「Show fields on menu items that point to content」を確認してください。「Never」が選択されている場合、ノードを参照するメニュー項目ではフィールドが表示されません。「Always」に変更するか、Node Accessモジュールを無効にして「If NO Node Access Modules are enabled」を選択してください。
Security Notes 3
- Menu Per Roleはメニュー項目の「表示」のみを制御します。メニューリンク先のページへのアクセス自体は制限しません。URLを直接入力してアクセスすることは可能なため、重要なコンテンツには別途アクセス制御を設定してください
- 「bypass menu_per_role access」パーミッションは、すべてのメニュー項目を表示する権限です。信頼できるロールにのみ付与してください
- 管理者バイパス設定を有効にすると、管理者ロールを持つすべてのユーザーがメニュー制限を無視できます。管理者ロールの付与は慎重に行ってください