Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-06-20T08:46:23+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Voter non reconnu, message #1147602016-06-20T08:46:23+02:00Nek/@Nekhttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114760<p>(topic solved man !)</p>Voter non reconnu, message #1147592016-06-20T08:36:26+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114759<p><img alt=":-°" src="/static/smileys/siffle.png"></p>
<p>Je me disais bien que c'était très probablement une stupidité : le tag n'était pas bon, reste d'un copié-collé… <img alt=">_<" src="/static/smileys/pinch.png"></p>
<p>Heureusement que j'ai eu tout le week-end pour celle-là <img alt="^^" src="/static/smileys/hihi.png"></p>
<p>Merci à tous !</p>
<figure><blockquote>
<p>(topic solved man !)
</p>
</blockquote>
<figcaption><p><a href="#p114760">Nek</a></p></figcaption></figure><p>J'attends d'avoir testé avant, au cas où je pourrai le recycler, mais ce ne sera pas nécessaire, apparemment.</p>Voter non reconnu, message #1147462016-06-19T23:39:24+02:00QuentinC/@QuentinChttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114746<blockquote>
<p>En fait, je finis par me demander s'il ne manque pas une autre partie de configuration ou que simplement mon appel avec un attribut bidon ne fait pas tout
foirer, parce que si j'active les lignes qui font cette vérification, je n'ai plus possibilité de visualiser ou d'éditer les détails de n'importe-quel
objet, j'ai une 403 qui sort, même si je suis censé avoir les droits.</p>
</blockquote>
<p>Pour la configuration, perso dans mon projet j'ai deux voteurs qui sont configurés comme ceci et ça marche :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span> app.XXXAccessChecker:
class: AppBundle\Controller\XXXAccessChecker
arguments: ['@security.access.decision_manager', '@doctrine']
public: false
tags: [{ name: security.voter }]
</pre></div>
</td></tr></table>
<p>Donc si tu as quelque chose de similaire ça devrait fonctionner.</p>
<p>Si le constructeur est appelé, ça veut dire que ton service est en tout cas bien référencé. Par contre si en appelant denyAccessUnlessGranted il te jette une 403 sans même appeler ta méthode support, ça me fait penser qu'il ne reconnaît peut-être pas ton service comme étant un voteur. Le tag est-il présent et correct ?</p>
<p>Autre possibilité, effectivement, l'attribut. Mais si tu n'en as pas besoin, que tu ne le vérifies pas, et que tu as mis n'importe quelle string non vide, je ne vois pas pourquoi ça ne fontionnerait pas; ou du moins pas pourquoi la méthode support ne serait pas appelée.
Juste, ne pas oublier que, aussi bien pour isGranted que denyAccessUnlessGranted ou is_granted en twig, le premier argument est l'attribut, et le second l'objet. Je ne sais pas si on a le droit de passer autre chose qu'une string en tant qu'attribut, je n'ai jamais vu aucun exemple passant autre chose en tout cas; d'où peut-être un if pas string alors dehors direct, sans même boucler sur les instances de voteurs pour voir s'il y en a un qui correspond au cas demandé.</p>
<blockquote>
<p>Autre élément parce que je ne peux pas trop demander sans tout fournir : les rôles enregistrés dans l'objet sont vides par défaut, je devrais peut-être
mettre au moins IS_AUTHENTICATED_FULLY, je rajouterai cet élément "par défaut" demain.</p>
</blockquote>
<p>Ca c'est un risque que tu te fasses jeter par la méthode voteONAttribute. Mais avant de faire ça il faudrait d'abord savoir pourquoi support n'est pas appelé avant. La méthode support doit nécessairement être appelée avant voteOnAttribute, parce qu'avant de savoir si ton voteur donne l'accès ou non, Symfony doit d'abord savoir si c'est bien ce voteur-là qui est responsable pour ce couple attribut/objet et pas un autre.</p>
<p>D'où ma conclusion pour l'instant, ton service est instancié mais pas reconnu comme étant un voteur pour je ne sais quelle raison, peut-être une erreur de configuration effectivement.</p>Voter non reconnu, message #1146392016-06-19T10:17:58+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114639<p>Je souhaite utiliser <code>isGranted('unAttributAuHasardParceQuIlEnFautUnApparemment', $lObjetAccess)</code> dans mon contrôleur, l'idée étant de jeter une 403 à l'accès en édition et/ou à l'affichage.<br>
En fait, je finis par me demander s'il ne manque pas une autre partie de configuration ou que simplement mon appel avec un attribut bidon ne fait pas tout foirer, parce que si j'active les lignes qui font cette vérification, je n'ai plus possibilité de visualiser ou d'éditer les détails de n'importe-quel objet, j'ai une 403 qui sort, même si je suis censé avoir les droits.<br>
Autre élément parce que je ne peux pas trop demander sans tout fournir : les rôles enregistrés dans l'objet sont vides par défaut, je devrais peut-être mettre au moins <code>IS_AUTHENTICATED_FULLY</code>, je rajouterai cet élément "par défaut" demain.</p>
<p>Pour savoir que la classe est bien instanciée et les deux méthodes pas appelées, j'utilise xdebug et je fais une exécution pas à pas dans Eclipse, avec des points d'arrêt dans les méthodes que j'aimerais voir appelées. Le script s'arrête donc bien dans le constructeur, mais ne passe jamais dans les deux méthodes, les deux points d'arrêt n'étant jamais rencontrés.</p>Voter non reconnu, message #1145782016-06-18T16:14:52+02:00QuentinC/@QuentinChttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114578<p>Je n'ai pas l'impression de voir quelque chose de faux ni dans ton voteur, ni dans la conf. Du coup j'ai une autre question, comment l'invoques-tu ? via isGranted/denyAccessUnlessGranted, ou is_granted dans un Template ?
Comment es-tu sûr que la classe est instanciée mais que la méthode support n'est pas appelée ? (Tiens d'ailleurs, ça me fait me demander, Est-ce qu'il y a mieux pour débugger ce genre de trucs que de faire du die à l'ancienne ?)</p>Voter non reconnu, message #1145162016-06-17T18:16:17+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114516<p>J'ai bien mis <code>arguments</code> avec le même service, je n'ai peut-être juste pas mis que le service n'était pas public, mais j'imagine que c'est un détail (je n'ai plus le code sous la main en ce moment).</p>
<p>Vu que la classe est instanciée, on est OK de ce côté-là.</p>Voter non reconnu, message #1144362016-06-17T10:37:13+02:00Hugo/@Hugohttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114436<p>Tu peux nous donner la configuration, histoire qu'on vérifie ensemble ?</p>
<p>Elle doit ressembler à ça:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">services</span><span class="p p-Indicator">:</span>
<span class="l l-Scalar l-Scalar-Plain">app.access_voter</span><span class="p p-Indicator">:</span>
<span class="l l-Scalar l-Scalar-Plain">class</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">My\WonderfullBundle\Security\AccessVoter</span>
<span class="l l-Scalar l-Scalar-Plain">arguments</span><span class="p p-Indicator">:</span> <span class="p p-Indicator">[</span><span class="s">'@security.access.decision_manager'</span><span class="p p-Indicator">]</span>
<span class="l l-Scalar l-Scalar-Plain">public</span><span class="p p-Indicator">:</span> <span class="l l-Scalar l-Scalar-Plain">false</span>
<span class="l l-Scalar l-Scalar-Plain">tags</span><span class="p p-Indicator">:</span>
<span class="p p-Indicator">-</span> <span class="p p-Indicator">{</span> <span class="nv">name</span><span class="p p-Indicator">:</span> <span class="nv">security.voter</span> <span class="p p-Indicator">}</span>
</pre></div>
</td></tr></table>
<p>Tu as bien mis <code>arguments</code> ?</p>Voter non reconnu, message #1144272016-06-17T09:27:57+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/6336/voter-non-reconnu/?page=1#p114427<p>Bonjour,</p>
<p>J'aurais besoin d'un œil extérieur.</p>
<p>Dans l'idée de mettre en place des sécurités d'accès sur certains objets, j'ai donc créé un voter. L'idée de base est de pouvoir choisir les rôles qui auront accès à l'objet lors de la création ou de l'édition de celui-ci.</p>
<p>Le hic, c'est que c'est comme si mon voter n'existait pas, en cela que je ne passe apparemment pas ni dans la méthode <code>supports(…)</code>, ni dans <code>voteOnAttribute(…)</code>, alors que le service est bien instancié.</p>
<p>Est-ce que quelqu'un pourrait me dire qu'est-ce qui cloche ?</p>
<p>Merci d'avance <img alt=":)" src="/static/smileys/smile.png"></p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="cp"><?php</span>
<span class="k">namespace</span> <span class="nx">My\WonderfulBundle\Security</span><span class="p">;</span>
<span class="k">use</span> <span class="nx">Symfony\Component\Security\Core\Authorization\Voter\Voter</span><span class="p">;</span>
<span class="k">use</span> <span class="nx">Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface</span><span class="p">;</span>
<span class="k">use</span> <span class="nx">Symfony\Component\Security\Core\Authentication\Token\TokenInterface</span><span class="p">;</span>
<span class="k">use</span> <span class="nx">My\WonderfulBundle\Entity\Access</span><span class="p">;</span>
<span class="k">class</span> <span class="nc">AccessVoter</span> <span class="k">extends</span> <span class="nx">Voter</span>
<span class="p">{</span>
<span class="k">private</span> <span class="nv">$decisionManager</span><span class="p">;</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">__construct</span><span class="p">(</span><span class="nx">AccessDecisionManagerInterface</span> <span class="nv">$decisionManager</span><span class="p">)</span>
<span class="p">{</span>
<span class="nv">$this</span><span class="o">-></span><span class="na">decisionManager</span> <span class="o">=</span> <span class="nv">$decisionManager</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">protected</span> <span class="k">function</span> <span class="nf">voteOnAttribute</span><span class="p">(</span><span class="nv">$attribute</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">,</span> <span class="nx">TokenInterface</span> <span class="nv">$token</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">decisionManager</span><span class="o">-></span><span class="na">decide</span><span class="p">(</span><span class="nv">$token</span><span class="p">,</span> <span class="nv">$subject</span><span class="o">-></span><span class="na">getRoles</span><span class="p">()))</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">protected</span> <span class="k">function</span> <span class="nf">supports</span><span class="p">(</span><span class="nv">$attribute</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// only vote on Access objects inside this voter</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$subject</span> <span class="nx">instanceof</span> <span class="nx">Access</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="k">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
</p>
</div>