mcpField
D
drupal-access

drupal-access

github.com/edutrul安全7349 次安装21 周前更新
代码仓库

关于 drupal-access

Drupal Access Control 技能提供 Drupal 权限、路由访问要求、自定义访问检查器和实体访问的代码示例。适用于实现或审查 Drupal 模块中的访问控制逻辑。

主要功能

  1. 01定义模块权限
  2. 02配置路由访问要求
  3. 03编写自定义访问检查器
  4. 04使用 AccessResult 判定访问
  5. 05检查实体与账户权限
  6. 06通过钩子控制实体访问

适用场景

  1. 01为 Drupal 模块添加权限
  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 模式

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

评论

支持 Markdown