【Drupal】カスタム権限を追加してモジュールで制御する

【Drupal】カスタム権限を追加してモジュールで制御する
sinceretechnology

 

 

 

 

 

 

アクセス制御ハンドラーは、ノード、ユーザー、管理ページなど、システムのさまざまな部分へのアクセスを制御するために Drupal 全体で広く使用されています。

Drupal のアクセス制御ハンドラーは、さまざまなモジュールやフックを通じてカスタマイズおよび拡張でき、カスタム基準に基づいたアクセスの制限やカスタム ワークフローの実装など、より高度なアクセス制御機能を提供できます。

この要点では、カスタム アクセス制御ハンドラーをエンティティ タイプ「ノード」に追加し、カスタム権限に基づいてフィールドを制限する方法を説明します。

 

 

 

 

 mymodule.permissions.yml を作成する

 

モジュール内 mymodule.permissions.ymlにて、カスタム権限を設定します。

 

# mymodule.permissions.yml
            view premium content:
              title: 'View premium content'
              description: 'Allow user to see premium content.'

 

ここで設定された項目は、管理や画面のユーザ->権限に表示されます。

対象の権限に対して有効/無効を設定することができます。

 

 

 

 

アクセス制御ハンドラークラスを実装する

 

管理者画面で設定された権限のステータスを参照して動作を制御します。ここではその判定及び制御処理を記述します。

 

<?php
            namespace Drupal\mymodule;
            use Drupal\Core\Access\AccessResult;
            use Drupal\Core\Field\FieldDefinitionInterface;
            use Drupal\Core\Field\FieldItemListInterface;
            use Drupal\Core\Session\AccountInterface;
            use Drupal\node\NodeAccessControlHandler;
            /**
             * Defines the custom access control handler for the node entity type.
             */
            class PremiumContentAccessControlHandler extends NodeAccessControlHandler {
              /**
               * {@inheritdoc}
               */
              protected function checkFieldAccess(
                $operation,
                FieldDefinitionInterface $field_definition,
                AccountInterface $account,
                FieldItemListInterface $items = NULL
              ) {
                /*
                 * Allow specific roles to access premium content.
                 */
                if ($field_definition->getName() === 'field_premium_content') {
                  if ($operation == 'view') {
                    return AccessResult::allowedIfHasPermission(
                      $account,
                      'view premium content'
                    );
                  }
                }
                // Run parent's checkFieldAccess.
                return parent::checkFieldAccess(
                  $operation,
                  $field_definition,
                  $account,
                  $items
                );
              }
            }

 

 

 

 

アクセス制御ハンドラークラスをエンティティにアタッチする

 

エンティティにアクセス制御ハンドラー クラスをアタッチするには、hook_entity_type_alter を使用します。

 

<?php
            /**
             * @file mymodule.module
             * Includes drupal hooks for module.
             */
            use Drupal\mymodule\PremiumContentAccessControlHandler;
            /**
             * Implements hook_entity_type_alter().
             */
            function mymodule_entity_type_alter(array &$entity_types) {
              $entity_types['node']->setHandlerClass('access', PremiumContentAccessControlHandler::class);
            }
 

 

 

 

参考

 

以下のサイトを参考にしました

Custom access control handler - Drupal

 

 

 

 


この記事に関するご質問やご意見などございましたらお問い合わせフォームからお気軽にご連絡ください。