🔥

Drupalで管理者以外のユーザーにも設定画面へのアクセスを許可する方法

に公開

本記事の一部はAIが作成しました。

概要

Drupalでカスタムモジュールの設定画面を作成する際、管理者以外のユーザーにもアクセスを許可したい場合があります。今回は、GitHub Webhookモジュールを例に、この問題の解決方法を説明します。

https://zenn.dev/nakamura196/articles/11f85c2ef4fca7

問題の発生

最初の状態では、以下のようなルーティング設定でした:

# github_webhook.routing.yml
github_webhook.settings:
  path: '/admin/config/github_webhook'
  defaults:
    _form: '\Drupal\github_webhook\Form\SettingsForm'
    _title: 'GitHub Webhook Settings'
  requirements:
    _permission: 'administer site configuration'

この設定では、administer site configuration権限を持つ管理者のみがアクセス可能で、一般ユーザーはアクセスできませんでした。

解決方法1: 専用権限の作成

まず、専用の権限を作成します。github_webhook.permissions.ymlファイルを新規作成:

access github webhook settings:
  title: 'Access GitHub Webhook Settings'
  description: 'Allow users to access GitHub webhook configuration.'

そして、ルーティングファイルを更新:

# github_webhook.routing.yml
github_webhook.settings:
  path: '/admin/config/github_webhook'
  defaults:
    _form: '\Drupal\github_webhook\Form\SettingsForm'
    _title: 'GitHub Webhook Settings'
  requirements:
    _permission: 'access github webhook settings'

問題の発覚: /adminパスの制限

しかし、この変更だけでは解決しませんでした。Drupalでは/admin配下のパスは管理エリアとして扱われ、追加の権限チェックが行われるためです。

解決方法2: パスの変更

根本的な解決として、パスを管理エリア外に移動:

# github_webhook.routing.yml
github_webhook.settings:
  path: '/github-webhook/settings'  # 管理パス外に変更
  defaults:
    _form: '\Drupal\github_webhook\Form\SettingsForm'
    _title: 'GitHub Webhook Settings'
  requirements:
    _permission: 'access github webhook settings'

新たな問題: 管理画面からの消失

パスを移動すると、今度は管理画面の設定一覧から項目が消失してしまいました。

最終解決: メニューリンクの手動追加

この問題を解決するために、github_webhook.links.menu.ymlファイルを作成:

github_webhook.settings:
  title: 'GitHub Webhook Settings'
  description: 'Configure GitHub webhook settings.'
  route_name: github_webhook.settings
  parent: system.admin_config_services
  weight: 10

これにより、パスは/github-webhook/settingsのままで、管理画面の「サービス設定」配下にもメニュー項目が表示されるようになります。

配置場所のカスタマイズ

parentの値を変更することで、管理画面内の表示場所を調整できます:

  • system.admin_config_services - 「サービス設定」配下
  • system.admin_config_system - 「システム設定」配下
  • system.admin_config_development - 「開発設定」配下
  • system.admin_config - 「設定」のトップレベル

.links.menu.ymlファイルの代わりに、モジュールファイル内でフックを使用することも可能です:

/**
 * Implements hook_menu_links_discovered_alter().
 */
function github_webhook_menu_links_discovered_alter(&$links) {
  $links['github_webhook.settings'] = [
    'title' => 'GitHub Webhook Settings',
    'route_name' => 'github_webhook.settings',
    'description' => 'Configure GitHub webhook settings.',
    'parent' => 'system.admin_config_services',
    'weight' => 10,
  ];
}

権限の付与

最後に、管理画面の「ユーザー権限」ページで、適切なロールに新しく作成したaccess github webhook settings権限を付与します。

まとめ

Drupalで管理者以外のユーザーに設定画面へのアクセスを許可するには:

  1. 専用権限の作成 - .permissions.ymlファイルで新しい権限を定義
  2. パスの変更 - /admin配下から通常のパスに移動
  3. メニューリンクの追加 - .links.menu.ymlで管理画面に項目を表示
  4. 権限の付与 - 管理画面で適切なロールに権限を設定
  5. キャッシュクリア - drush crで変更を反映

これらの手順により、柔軟な権限管理が可能になり、プロジェクトのニーズに応じたアクセス制御を実現できます。

変更を行った際は、必ずdrush crでキャッシュをクリアすることを忘れずに!

さいごに

間違っている点もあるかもしれませんが、参考になりましたら幸いです。

Discussion