mcpField
D
drupal-access

drupal-access

github.com/edutrulセキュリティ7349 回インストール21 週間前に更新
リポジトリ

drupal-access について

Drupal Access Control は、権限、ルートのアクセス要件、カスタムアクセスチェッカー、エンティティアクセスのコード例を提供するスキルです。Drupal モジュールのアクセス制御ロジックの実装や確認に役立ちます。

主な機能

  1. 01モジュール権限の定義
  2. 02ルートアクセス要件の設定
  3. 03カスタムアクセスチェッカーの作成
  4. 04AccessResult による判定
  5. 05エンティティとアカウントのアクセス確認
  6. 06フックによるエンティティアクセス制御

活用シーン

  1. 01Drupal モジュールへの権限追加
  2. 02ロールや権限によるルート制限
  3. 03コンテンツエンティティのアクセス規則の実装

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/edutrul/drupal-ai --skill drupal-access

インストール後、Claude Code で/drupal-accessを入力して読み込まれたか確認します。

同梱ファイルREADME.md

詳細

Drupal のアクセス制御

権限の定義(permissions.yml)

administer my module:
  title: 'Administer My Module'
  restrict access: true

view my content:
  title: 'View My Content'

ルートの要件

requirements:
  _permission: 'administer my module'   # Permission check
  _role: 'administrator'                # Role check
  _custom_access: '\Drupal\my_module\Access\MyAccessCheck::access'
  _entity_access: 'node.update'
  _access: 'TRUE'

カスタムアクセスチェッカー

namespace Drupal\my_module\Access;

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Access\AccessResultInterface;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\Core\Session\AccountInterface;

final class MyAccessCheck implements AccessInterface {

  public function access(AccountInterface $account): AccessResultInterface {
    if ($account->hasPermission('administer site configuration')) {
      return AccessResult::allowed()->cachePerPermissions();
    }
    if ($account->hasPermission('view my content')) {
      return AccessResult::allowed()->cachePerPermissions();
    }
    return AccessResult::forbidden()->cachePerPermissions();
  }

}

アクセス結果のパターン

AccessResult::allowed();
AccessResult::forbidden();
AccessResult::neutral();
AccessResult::allowedIf($condition);
AccessResult::forbiddenIf($condition);
AccessResult::allowedIfHasPermission($account, 'my permission');

// Cache correctly
$result->cachePerPermissions();         // Varies by user permissions
$result->cachePerUser();                // Varies by user identity
$result->addCacheableDependency($node); // Varies by entity
$result->setCacheMaxAge(0);             // Not cacheable

コード内でのアクセス確認

$node->access('view', $account);
$node->access('update', $account);
$account->hasPermission('administer content');
$account->hasRole('editor');

エンティティアクセスフック

#[Hook('node_access')]
public function nodeAccess(NodeInterface $node, string $op, AccountInterface $account): AccessResultInterface {
  if ($op === 'view' && $node->bundle() === 'private') {
    return AccessResult::forbiddenIf(
      !$account->hasPermission('view private content')
    )->cachePerPermissions()->addCacheableDependency($node);
  }
  return AccessResult::neutral();
}

コメント