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

I like your writing skills and appreciate your working effort making on this post. 

Ajouter un commentaire

Ne sera pas publié

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