Le panneau du profileur : quelle pile a répondu

Un refus est délibérément silencieux dans la réponse. Le 403 dit que la porte a été fermée ; le panneau du profileur dit quelle porte, qui l’a fermée, et pourquoi.

Avec symfony/web-profiler-bundle installé, un panneau Access Control apparaît dans la barre d’outils et montre chaque question posée par la requête.

La barre d’outils, et la valeur d’un zéro

Elle montre le nombre de décisions prises pendant la requête, et combien ont été accordées et refusées. Le zéro mérite qu’on s’y arrête : un contrôleur sans politique d’accès et un point d’entrée dont l’écouteur n’est pas enregistré se ressemblent exactement, vus de l’extérieur.

Une subtilité, apprise en se trompant d’abord : le panneau juge du vide sur les questions, pas sur les décisions. Un When qui s’efface ne prend aucune décision, et pourtant une question a été posée et traitée ; une version antérieure annonçait « aucune décision d’accès n’a été prise » sur une page qui était pourtant gardée.

L’onglet Decisions

Chaque question, dans l’ordre où elles ont été posées, et pour chacune :

  • l’attribut et le sujet,
  • le verdict et la raison,
  • l’algorithme de combinaison qui l’a produit,
  • chaque vote, avec le votant qui l’a émis et ce qu’il a répondu,
  • d’où venait la question : le point d’entrée, et le code appelant.

Cette dernière ligne est celle qui sauve un après-midi. Une question que personne n’a déclarée, posée depuis un gabarit ou par un service de sa propre initiative, est nommée par fichier et par ligne plutôt que laissée en entrée anonyme dans une liste.

L’imbrication est montrée, pas aplatie

Une question posée depuis une autre est montrée en dessous, ce qui arrive chaque fois qu’une expression appelle is_granted(). La forme d’une politique d’accès est montrée de la même façon :

  • All(A, B) montre l’opérateur et les deux branches, pas deux décisions côte à côte.
  • AtLeastOneOf(A, B) où A accorde montre l’opérateur et la seule branche atteinte.
  • When(false, ...) montre qu’il s’est effacé, et pourquoi.

Les politiques composites de votre cru reçoivent cela sans qu’il faille écrire une ligne de panneau : l’évaluateur annonce chaque nœud de l’arbre, et le collecteur le reconstruit.

L’onglet Configuration, et la question à poser en premier

Il nomme l’algorithme de combinaison par défaut, dit si l’application l’a choisi ou si elle est sur le défaut, et liste les votants enregistrés, chacun lié à son fichier. Et il répond à la question dont dépend une migration : quelle pile a répondu à quoi.

  • decisions : si c’est le composant, Security, ou un gestionnaire applicatif à vous qui décide.
  • is_granted : quel écouteur lit #[IsGranted].
  • twig : quelle extension publie les fonctions de gabarit.

Une application qui a installé le bundle et qui voit encore Security nommé là a une passerelle qui n’a pas pris la main. Le découvrir dès la première page ouverte est toute la raison de mettre cela dans un panneau plutôt que dans une page de documentation.

Le panneau lit les événements que le gestionnaire émet, et les assertions de test aussi : le même journal, l’un avec un navigateur et l’autre sans.