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.

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

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é)

  1. # mon_module/src/Entity/AccessControlHandler/CustomShoutboxAccessControlHandler.php
  2. <?php
  3.  
  4. namespace Drupal\mon_module\Entity\AccessControlHandler;
  5.  
  6. use Drupal\Core\Access\AccessResult;
  7. use Drupal\Core\Entity\EntityInterface;
  8. use Drupal\Core\Session\AccountInterface;
  9. use Drupal\shoutbox\Entity\AccessControlHandler\ShoutboxAccessControlHandler;
  10. use Drupal\shoutbox\Entity\Shoutbox;
  11. use Drupal\user\Entity\User;
  12.  
  13. class CustomShoutboxAccessControlHandler extends ShoutboxAccessControlHandler {
  14.  
  15. protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
  16. /** @var Shoutbox $entity */
  17. if($operation === 'view' && $this->testPerso()) {
  18. if (!$entity->isPublished()) {
  19. return AccessResult::allowedIfHasPermission($account, 'administer shoutbox');
  20. }
  21. if ($this->autreTest()) {
  22. return AccessResult::allowed();
  23. }
  24. return AccessResult::forbidden('Shoutbox privée');
  25. }
  26. return parent::checkAccess($entity, $operation, $account);
  27. }
  28.  
  29. }

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

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...