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.
Commentaires
Great share!
Ajouter un commentaire