mcpField
D
drupal-access

drupal-access

github.com/edutrulSecurity7349 installsUpdated 21w ago
Repository

About drupal-access

Drupal Access Control is a skill with code examples for permissions, route access requirements, custom access checkers, and entity access. It is intended for implementing or reviewing access-control logic in Drupal modules.

Key features

  1. 01Define module permissions
  2. 02Set route access requirements
  3. 03Write custom access checkers
  4. 04Use AccessResult for decisions
  5. 05Check entity and account access
  6. 06Control entity access with hooks

Use cases

  1. 01Add permissions to a Drupal module
  2. 02Restrict routes by role or permission
  3. 03Implement access rules for content entities

Install

Copy the command and run it in a terminal.

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

After installing, type/drupal-accessin Claude Code to confirm it loaded.

Bundled filesREADME.md

Details

From the project README

Drupal Access Control

Defining Permissions (permissions.yml)

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

view my content:
  title: 'View My Content'

Route Requirements

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'

Custom Access Checker

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 Patterns

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

Checking Access in Code

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

Entity Access Hook

#[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();
}

Comments

Markdown supported