Menu Admin per Menu

メニューごとに細かな管理権限を提供し、完全なメニュー管理権限を付与することなく、特定のメニューのみを管理できるロールを設定できます。

menu_admin_per_menu
51,774 sites
67
drupal.org

インストール

Drupal 12, 11, 10 v8.x-1.7
composer require 'drupal/menu_admin_per_menu:8.x-1.7'
Drupal 9 v8.x-1.5
composer require 'drupal/menu_admin_per_menu:8.x-1.5'
Drupal 8 v8.x-1.4
composer require 'drupal/menu_admin_per_menu:8.x-1.4'

概要

デフォルトでは、Drupalはグローバルな「メニューとメニュー項目の管理」権限を持つユーザーのみがメニュー項目の追加、変更、削除を行えます。これにより、すべてのメニューを完全に制御できるか、まったく制御できないかという二者択一の状況が生まれます。

Menu Admin per Menuは、Drupalサイト内の各メニューに対して個別の権限を動的に作成することで、この制限を解決します。たとえば、Navigationメニューや管理メニューへのアクセス権を与えずに、Mainメニューのみを管理する権限をロールに付与できます。

このモジュールはDrupalの既存のメニュー管理インターフェースとシームレスに統合され、メニュー概要ページを自動的にフィルタリングして、ユーザーが管理権限を持つメニューのみを表示します。また、ノード編集フォームの親メニュー選択も適切にフィルタリングし、ユーザーがアクセス権を持つメニューにのみコンテンツを配置できるようにします。

これはDrupal 7のコアメニューシステムを拡張し、きめ細かなアクセス制御機能を追加するモジュールです。

Features

  • 各メニューに対する動的な権限を作成(例:「Administer Main menu menu items」、「Administer Navigation menu items」)
  • メニュー管理の概要ページをフィルタリングし、ユーザーが管理権限を持つメニューのみを表示
  • 追加、編集、リセット、削除を含む個々のメニューリンク操作へのアクセスを制御
  • ユーザーのメニュー権限に基づいて、ノード編集フォームの親メニューオプションを自動的にフィルタリング
  • 他のモジュールがメニューごとの権限割り当てをプログラム的に変更できるalter hookを提供
  • パフォーマンス向上のため、ユーザーアカウントごとに権限ルックアップをキャッシュ
  • グローバルな「Administer menus and menu items」権限を持つユーザーとの完全な互換性を維持

Use Cases

限定的なメニューアクセスを持つコンテンツ編集者

ウェブサイトにコンテンツ編集者がおり、Mainメニューにページを追加できる必要がありますが、管理メニューやその他のシステムメニューへの変更アクセスは持つべきではありません。このモジュールを有効にし、Content Editorロールに「Administer Main menu menu items」権限を付与することで、編集者はMainメニュー項目を管理でき、他のメニューへのアクセスは制限されます。

部門別メニュー管理

複数部門の組織ウェブサイトに、各部門用の個別メニュー(HRメニュー、Salesメニュー、Engineeringメニュー)があります。各部門マネージャーは自分の部門のメニューのみを管理する必要があります。このモジュールにより、各部門の特定のメニューのみに権限を持つロールを作成できます。

フッターメニューアクセスの制限

フッターメニューには、上級管理者のみが変更すべき重要なリンクが含まれています。通常の管理者は他のすべてのメニューを管理できますが、フッターメニューの権限は特別なロールにのみ付与され、重要なリンクが保護されます。

プログラムによるメニュー権限制御

カスタムモジュールが複雑なビジネスロジック(例:ユーザープロフィールフィールドやグループメンバーシップに基づく)に基づいて、ユーザーがアクセスできるメニューを動的に制御する必要があります。hook_menu_admin_per_menu_perm_menus_alter()を使用して、カスタムモジュールはプログラム的にメニューアクセスを追加または削除できます。

Tips

  • グローバルな「Administer menus and menu items」権限を持つユーザーは、メニューごとの権限をバイパスして自動的にすべてのメニューにアクセスできます
  • モジュールはパフォーマンスのためにユーザーアカウントごとに権限ルックアップをキャッシュします - 権限変更後はキャッシュをクリアしてください
  • 標準のロール権限では対応できない複雑な権限シナリオには、hook_menu_admin_per_menu_perm_menus_alter() hookを使用してください
  • ユーザーがアクセスできないメニューにメニュー項目が既に存在する場合、そのノードの編集フォームではメニューフィールドセットが非表示になります
  • モジュールはメニュー管理へのアクセスのみを制御します - フロントエンドでエンドユーザーにメニューがどのように表示されるかには影響しません

Technical Details

Admin Pages 6
メニュー /admin/structure/menu

すべてのメニューを一覧表示する概要ページ。グローバルな「administer menu」権限を持たないユーザーがアクセスした場合、このページはユーザーがメニューごとの管理権限を持つメニューのみを表示するようフィルタリングされます。許可された各メニューには「list links」と「add link」の操作リンクが表示されます。

メニュー管理 /admin/structure/menu/manage/%menu

特定のメニュー内のすべてのリンクを表示・管理します。アクセスはメニューごとに制御されます - ユーザーはグローバルな「administer menu」権限、または特定の「Administer [menu name] menu items」権限のいずれかが必要です。

メニューリンクを追加 /admin/structure/menu/manage/%menu/add

特定のメニューに新しいリンクを追加します。親メニューのドロップダウンは、ユーザーが管理権限を持つメニューと項目のみを表示するようフィルタリングされます。

メニューリンクを編集 /admin/structure/menu/item/%menu_link/edit

既存のメニューリンクを編集します。アクセスはリンクが属するメニューに基づいて制御されます。親メニューのドロップダウンはユーザーの権限に基づいてフィルタリングされます。

メニューリンクを削除 /admin/structure/menu/item/%menu_link/delete

メニューリンクを削除します。リンクを含むメニューの権限が必要です。

メニューリンクをリセット /admin/structure/menu/item/%menu_link/reset

メニューリンクをデフォルト設定にリセットします。リンクを含むメニューの権限が必要です。

権限 1
Administer [Menu Name] menu items

システム内の各メニューに対して動的に生成されます。たとえば、Mainメニューの場合は「administer main-menu menu items」となります。その特定のメニュー内のリンクの追加、編集、削除、並べ替えの権限を付与します。この権限を持つユーザーは概要ページでメニューを確認でき、コンテンツ編集時に親として選択できます。

Hooks 1
hook_menu_admin_per_menu_perm_menus_alter

ユーザーがメニューごとの管理権限を持つメニューの配列をモジュールが変更できるようにします。このhookは、モジュールがユーザーの権限に基づいてアクセスできるメニューを決定した後に呼び出されます。

Troubleshooting 4
モジュールを有効化した後、ユーザーにメニューが表示されない

モジュールは自動的に権限を付与しません。admin/people/permissionsに移動し、関連するロールに適切な「Administer [menu name] menu items」権限を割り当ててください。

メニューごとの権限を持つユーザーがメニューにコンテンツを配置できない

コンテンツを配置したい特定のメニューに対して、ユーザーのロールが「Administer [menu name] menu items」権限を持っていることを確認してください。この権限はメニュー管理ページとノード編集フォームのメニュー選択の両方に影響します。

hook_menu_admin_per_menu_perm_menus_alterへの変更が反映されない

権限ルックアップはユーザーごとにキャッシュされるため、Drupalのキャッシュをクリアしてください。drush cc allを使用するか、admin/config/development/performanceに移動してキャッシュをクリアしてください。

ユーザーがアクセスすべきでないメニューがまだ表示される

ユーザーがグローバルな「Administer menus and menu items」権限を持っていないことを確認してください。この権限はメニューごとの権限をオーバーライドし、すべてのメニューへのアクセスを許可します。

Security Notes 4
  • モジュールはユーザー間の権限漏洩を防ぐため、ユーザーアカウントごとに適切な権限キャッシュを含んでいます
  • すべてのアクセスチェックは、その権限を持つユーザーに対してグローバルな「administer menu」権限に適切にフォールバックします
  • alter hookはプログラム的な制御を可能にしますが、意図しないアクセス許可を誤って付与しないよう慎重に実装する必要があります
  • このモジュールはDrupal公式のセキュリティアドバイザリ対象であり、セキュリティ問題はDrupal Security Teamによってレビューおよび対応されます