Drupal 8 - Surcharger la classe de contrôle d'accès d'un type d'entité

Posté le Jeudi 11 juillet 2019 - 16:04
Dernière mise à jour le Lundi 29 juillet 2019 - 15:23

Sous drupal 8, les types d'entités, comme les noeuds, viennent avec leur classe pour gérer le contrôle d'accès (création / modification / visualisation / suppression).

Il est possible de surcharger ces classes pour personnaliser plus finement ce contrôle.

Nous allons ici surcharger le contrôle d'accès pour un type d'entité « shoutbox », mais c'est le même principe pour les nodes.

# mon_module.module
function mon_module_entity_type_alter(array &$entity_types) {
  $entity_types['shoutbox']->setHandlerClass('access', \Drupal\mon_module\Entity\AccessControlHandler\CustomShoutboxAccessControlHandler::class);
  // Note : si on avait voulu surcharger le controle d'accès aux noeuds : 
  //   $entity_types['node']->setHandlerClass('access', \Drupal\mon_module\Entity\AccessControlHandler\CustomNodeAccessControlHandler::class);
}

La classe en elle même, qui étant la classe de contrôle d'accès de base (définie dans l'annotation de notre type d'entité)

# mon_module/src/Entity/AccessControlHandler/CustomShoutboxAccessControlHandler.php
<?php

namespace Drupal\mon_module\Entity\AccessControlHandler;

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\shoutbox\Entity\AccessControlHandler\ShoutboxAccessControlHandler;
use Drupal\shoutbox\Entity\Shoutbox;
use Drupal\user\Entity\User;

class CustomShoutboxAccessControlHandler extends ShoutboxAccessControlHandler {

  protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
    /** @var Shoutbox $entity */
    if($operation === 'view' && $this->testPerso()) {
      if (!$entity->isPublished()) {
        return AccessResult::allowedIfHasPermission($account, 'administer shoutbox');
      }
      if ($this->autreTest()) {
        return AccessResult::allowed();
      }
      return AccessResult::forbidden('Shoutbox privée');
    }
    return parent::checkAccess($entity, $operation, $account);
  }

}

Ici je ne fais un contrôle d'accès que sur l'opération « view » pour la visualisation, je délègue tout le reste à la classe mère.

Aller plus loin ?

 

Commentaires

Ajouter un commentaire

Ne sera pas publié

CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...