Menu Item Role Access

メニュー項目に対するロールベースのアクセス制御を提供し、管理者がユーザーロールに基づいてメニュー項目の表示を制限できるようにします。

menu_item_role_access
12,416 sites
40
drupal.org

インストール

Drupal 11, 10 v8.x-2.4
composer require 'drupal/menu_item_role_access:8.x-2.4'
Drupal 9, 8 v8.x-2.1
composer require 'drupal/menu_item_role_access:8.x-2.1'

概要

Menu Item Role Accessは、メニュー項目にきめ細かいロールベースのアクセス制御を追加するDrupalモジュールです。デフォルトでは、Drupalのメニューシステムはユーザーがリンク先ページへのアクセス権を持っているかどうかに基づいてメニュー項目の表示・非表示を制御します。このモジュールはメニュー項目に直接ロール選択フィールドを追加することでその機能を拡張し、基盤となるページアクセスに関係なく、管理者が特定のメニュー項目をどのユーザーロールが閲覧できるかを制御できるようにします。

このモジュールはmenu link contentエンティティに2つのフィールドを追加します:メニュー項目を閲覧できるロールを指定する複数値のロール参照フィールドと、親メニュー項目がすべての子項目のアクセス設定を上書きできるようにする真偽値フィールドです。この階層継承機能は、ブランチ全体を特定のユーザーグループに制限すべき複雑なメニュー構造を管理する場合に特に便利です。

このモジュールは、Drupalのデフォルトの内部リンクターゲットアクセスチェック動作を上書きする設定オプションを提供し、ターゲットページへの直接アクセス権がなくても適切なロール割り当てを持つユーザーにメニュー項目を表示できるようにします。これは外部リンク、などの特殊なルート、およびメニューの表示をページアクセスとは独立して制御すべきシナリオで特に便利です。

Features

  • 複数のユーザーロールを選択できる個別メニュー項目のロールベース表示制御
  • 「子項目を上書き」オプションによる親から子へのアクセス継承で、ロール制限がメニュー階層に伝播
  • Drupalの内部リンクターゲットアクセスチェックを上書きする設定可能な動作により、ロール割り当てのみに基づいてメニュー項目を表示
  • <nolink>、<none>、<front>ページリンクを含む特殊なルートタイプのサポート
  • 適切なキャッシュ無効化のためのuser.rolesキャッシュコンテキストによる自動キャッシング
  • 適切な権限を持つユーザーのみがロール割り当てを編集できるフィールドレベルのアクセス制御
  • ベースフィールド定義を通じたDrupalのmenu_link_contentエンティティシステムとの完全な統合

Use Cases

メンバー専用ナビゲーションセクション

認証済みメンバーのみに表示されるメニューセクションを作成します。Membersメニューにメニュー項目を追加し、Menu Item Rolesフィールドで「authenticated」ロールのみを選択します。匿名の訪問者は、ターゲットページにアクセスできる場合でも、これらのメニュー項目を見ることができません。

ロール別ダッシュボードリンク

異なるユーザーロールに異なるダッシュボードリンクを表示します。「Editor Dashboard」「Manager Dashboard」「Admin Dashboard」の個別のメニュー項目を作成し、それぞれを対応するロールに制限します。すべての項目が同じメニューに存在できますが、一致するロールを持つユーザーにのみ表示されます。

階層的な部門メニュー

ブランチ全体が制限される部門固有のメニュー構造を作成します。「子項目を上書き」を有効にした「finance_staff」ロールに制限された親「Finance Department」メニュー項目を設定します。すべての子項目(Reports、Budgets、Invoices)は個別の設定なしで自動的に制限を継承します。

外部リンクの表示制御

ロールに基づいて外部リンクの表示を制御します。外部リンク(例:パートナーポータルやプレミアムリソースへのリンク)を追加し、ロール割り当てを使用して特定のサブスクリプションティアやメンバーシップレベルに制限します。

特定のオーディエンス向けの非リンクメニューヘッダー

特定のロールにのみ表示される<nolink>ルートを使用したセクションヘッダーを作成します。例えば、プレミアム購読者にのみ表示される「Premium Features」ヘッダーを作成し、その子項目も適切に制限します。

匿名ユーザー専用メニュー項目

「登録」や「ログイン」リンクなど、特定のメニュー項目を匿名(非ログイン)ユーザーにのみ表示します。これらの項目に「anonymous」ロールのみを割り当てると、ユーザーがログインすると自動的に非表示になります。

Tips

  • 変更を有効にするために、モジュール設定を変更した後は必ずキャッシュをクリアしてください
  • 大規模なメニュー階層の管理を簡素化するために「子項目を上書き」機能を使用してください - 各子項目を個別に設定するのではなく、親項目に制限を設定します
  • 外部リンクや特殊なルート(<nolink>、<none>、<front>)の場合、ロールベースの制限が正しく機能するように「内部リンクターゲットアクセスチェックを上書き」を有効にしてください
  • メニュー項目でロールが選択されていない場合、すべてのユーザーに表示されたままになります(デフォルトのDrupal動作)
  • モジュールはuser.rolesのキャッシュコンテキストを追加し、ロールベースの表示に対する適切なキャッシュ処理を保証します
  • 異なるユーザーロールとしてログインするか、ロール切り替えモジュールを使用してメニューの表示をテストし、アクセス設定が期待通りに機能することを確認してください

Technical Details

Admin Pages 1
Menu Item Role Accessモジュールの設定 /admin/config/menu-item-role-access

この設定ページでは、管理者がMenu Item Role Accessモジュールのグローバルな動作を制御できます。モジュールがDrupalのデフォルトのアクセスチェックシステムとどのように相互作用するか、子メニュー項目が親からアクセス制限を継承するかどうかを変更するオプションを提供します。

権限 2
Menu Item Role Accessフィールドを編集

menu link contentアイテムを作成または編集する際に「Menu Item Roles」フィールドを編集できるようにします。この権限がないと、「administer menu」権限を持っていても、メニュー項目編集フォームでロール選択フィールドは表示されません。

Menu Item Role Access設定を管理

/admin/config/menu-item-role-accessのモジュール設定ページへのアクセスを許可します。この権限を持つユーザーは、ロールベースアクセスチェックの動作に関するグローバル設定を変更できます。

Hooks 4
hook_entity_base_field_info

menu_link_contentエンティティタイプに2つのベースフィールドを追加します:「menu_item_roles」(無制限のカーディナリティを持つuser_roleへのエンティティ参照)と「menu_item_override_children」(継承制御用の真偽値フィールド)。

hook_form_menu_link_content_form_alter

「inherit_parent_access」設定オプションが有効かどうかに基づいて、「menu_item_override_children」フィールドを条件付きで非表示にするようにmenu link contentフォームを変更します。

hook_entity_field_access

「menu_item_roles」フィールドへのアクセスを制御し、「edit menu_item_role_access」権限を持つユーザーのみがフィールドを編集できるようにします。情報漏洩を防ぐために表示アクセスは禁止され、編集アクセスには特定の権限が必要です。

hook_help

モジュールがアクセス制御のためにメニュー項目にオプションのロールフィールドを追加することを説明するヘルプページのテキストを提供します。

Troubleshooting 5
このメニュー項目に対してロールが許可されていないのに、ユーザーがメニュー項目を見ることができる

デフォルトでは、/admin/people/permissionsのDrupalコア権限が優先されます。ロールがターゲットコンテンツの表示権限を持っている場合、Menu Item Role Accessの設定に関係なくメニュー項目が表示される可能性があります。/admin/config/menu-item-role-accessに移動して「内部リンクターゲットアクセスチェックを上書き」を有効にし、キャッシュをクリアしてください。

ロールが許可されているのに、ユーザーがメニュー項目を見ることができない

ユーザーのロールがターゲットコンテンツを表示するためのDrupalコア権限を持っていない可能性があります。必要なコア権限を付与するか、/admin/config/menu-item-role-accessで「内部リンクターゲットアクセスチェックを上書き」を有効にしてターゲットアクセスチェックをバイパスしてください。

子項目を上書き機能が動作しない

/admin/config/menu-item-role-accessで「親が子を上書きすることを許可」が有効になっていることを確認してください。また、親メニュー項目の編集フォームで「子項目を上書き」チェックボックスが有効になっていることを確認してください。最良の結果を得るために、「内部リンクターゲットアクセスチェックを上書き」も有効にしてください。

メニュー項目編集フォームにMenu Item Rolesフィールドが表示されない

現在のユーザーは「Edit The Menu Item Role Access Field」権限が必要です。/admin/people/permissionsで適切なロールにこの権限を付与してください。

ロール割り当ての変更がすぐに反映されない

drush crを使用するか、/admin/config/development/performanceからすべてのキャッシュをクリアしてください。モジュールは完全なキャッシュ再構築が必要な場合があるキャッシュコンテキストを使用しています。

Security Notes 4
  • このモジュールはメニュー項目の表示のみを制御します - 実際のページへのアクセス制御は提供しません。ユーザーは必要なページレベルの権限を持っていれば、URLを直接入力して制限されたページにアクセスできる可能性があります
  • 「内部リンクターゲットアクセスチェックを上書き」オプションは慎重に使用する必要があります。ユーザーが実際にアクセスできないページのメニュー項目が表示される可能性があり、サイト構造が明らかになる恐れがあります
  • メニュー項目のロール割り当てはエンティティ参照として保存され、変更には「edit menu_item_role_access」権限が必要で、表示設定への無許可の変更を防ぎます
  • モジュールはDrupalの「link to any page」権限を尊重します - この権限を持つユーザーはすべてのメニュー項目ロールチェックをバイパスします