{"id":546,"date":"2020-01-19T10:33:38","date_gmt":"2020-01-19T09:33:38","guid":{"rendered":"https:\/\/numa-bord.com\/miniblog\/?p=546"},"modified":"2020-01-25T13:49:30","modified_gmt":"2020-01-25T12:49:30","slug":"symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur","status":"publish","type":"post","link":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/","title":{"rendered":"Symfony 5 : Utiliser la fonction \u00ab\u00a0isGranted\u00a0\u00bb sur n&rsquo;importe quel objet utilisateur"},"content":{"rendered":"<p><i>Cet article est \u00e9crit pour la version 5 de Symfony mais \u00e0 priori il devrait aussi fonctionner au moins pour les version 3 et 4 du framework<\/i><\/p>\n<p>Sous Symfony la fonction permettant de savoir si l&rsquo;utilisateur en train de parcourir l&rsquo;application poss\u00e8de un certain r\u00f4le est \u00ab\u00a0isGranted\u00a0\u00bb elle est directement disponible \u00e0 l&rsquo;utilisation dans les templates twig, via les annotations, depuis le services \u00ab\u00a0Symfony\\Component\\Security\\Core\\Security\u00a0\u00bb ou directement dans les controllers de la fa\u00e7on suivante :<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isGranted<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'ROLE_ADMIN'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"co1\">\/\/l'utilisateur \u00e0 les droits admin<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Par contre il n&rsquo;existe pas de fa\u00e7on directe d&rsquo;utiliser cette fonction sur un objet utilisateur diff\u00e9rent de l&rsquo;utilisateur courant.<br \/>\n\u00c9tant donn\u00e9e le fonctionnement des r\u00f4les sous symfony, qui peuvent h\u00e9riter des droits d&rsquo;un autre r\u00f4le il ne faut pas utiliser un simple<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/in_array\"><span class=\"kw3\">in_array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'ROLE_ADMIN'<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getRoles<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"co1\">\/\/mauvaise pratique<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>En effet dans ce cas, si un utilisateur \u00e0 le r\u00f4le &lsquo;ROLE_SUPERADMIN&rsquo; qui h\u00e9rite de &lsquo;ROLE_ADMIN&rsquo; le contr\u00f4le ci dessus ne lui accordera pas les droits.<br \/>\nOn imagine ici la hi\u00e9rarchie des r\u00f4le suivante :<\/p>\n<div class=\"codecolorer-container yaml default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"yaml codecolorer\"><span class=\"co4\">role_hierarchy<\/span>:<span class=\"co3\"><br \/>\n&nbsp; &nbsp; ROLE_ADMIN<\/span><span class=\"sy2\">: <\/span>ROLE_USER<span class=\"co3\"><br \/>\n&nbsp; &nbsp; ROLE_SUPERADMIN<\/span><span class=\"sy2\">: <\/span>ROLE_ADMIN<\/div><\/div>\n<p>Pour r\u00e9soudre ce probl\u00e8me, nous allons cr\u00e9er la fonction \u00ab\u00a0isGranted\u00a0\u00bb prenant en param\u00e8tre un utilisateur et le r\u00f4le \u00e0 v\u00e9rifier dans un service \u00ab\u00a0Securizer\u00a0\u00bb, je vous le livre directement pr\u00eat \u00e0 utiliser :<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">namespace<\/span> App\\Service<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">use<\/span> App\\Entity\\User<span class=\"sy0\">;<\/span><span class=\"co1\">\/\/l'entit\u00e9 user de notre aplication<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw2\">use<\/span> Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManagerInterface<span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw2\">class<\/span> Securizer <span class=\"br0\">&#123;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$accessDecisionManager<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">&#40;<\/span>AccessDecisionManagerInterface <span class=\"re0\">$accessDecisionManager<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">accessDecisionManager<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$accessDecisionManager<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> isGranted<span class=\"br0\">&#40;<\/span>User <span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$attribute<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$object<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$token<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> UsernamePasswordToken<span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'none'<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'none'<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getRoles<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">accessDecisionManager<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">decide<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$token<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#91;<\/span><span class=\"re0\">$attribute<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$object<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Gr\u00e2ce \u00e0 la configuration par d\u00e9faut de Symfony on peux sans plus attendre utiliser ce service dans notre application et v\u00e9rifier correctement les droits de n&rsquo;importe quel utilisateur en prenant bien en compte la hi\u00e9rarchie des r\u00f4les configur\u00e9 dans le fichier \u00ab\u00a0security.yaml\u00a0\u00bb. Par exemple dans un controller on peux d\u00e9sormais faire :<\/p>\n<div class=\"codecolorer-container php default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"php codecolorer\"><span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> monController<span class=\"br0\">&#40;<\/span>App\\Service\\SecurizerSecurizer <span class=\"re0\">$securizer<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"co1\">\/\/r\u00e9cup\u00e9ration d'un utilisateur $user de n'importe quelle mani\u00e8re, par exemple via une requ\u00eate en base de donn\u00e9es.<\/span><br \/>\n&nbsp; &nbsp;<span class=\"co1\">\/\/verification des droits<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$securizer<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isGranted<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'ROLE_ADMIN'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"co1\">\/\/l'utilisateur \u00e0 les droits admin<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Il y&rsquo;a sans doute de nombreux cas ou ce besoin de contr\u00f4le des r\u00f4les sur un utilisateur autre que celui connect\u00e9 se fait sentir (d&rsquo;o\u00f9 la mise en place de cette fonctionnalit\u00e9 sous la forme d&rsquo;un service), particuli\u00e8rement lors de l&rsquo;utilisation de <a href=\"https:\/\/symfony.com\/doc\/current\/security\/voters.html\">Voters<\/a> pour s\u00e9curiser la gestion des droits de l&rsquo;application. Dans mon cas j&rsquo;ai d&rsquo;abord eu besoin de cette fonctionnalit\u00e9 pour contr\u00f4ler finement la possibilit\u00e9 de se \u00ab\u00a0connecter en tant que\u00a0\u00bb (<a href=\"https:\/\/symfony.com\/doc\/current\/security\/impersonating_user.html\">switch_user<\/a>) pour mes administrateurs.<br \/>\nVoir les d\u00e9tails dans le prochain article : <a href=\"https:\/\/numa-bord.com\/miniblog\/symfony-5-limiter-la-possibilite-de-switch_user-en-fonction-du-role-de-lutilisateur-cible\/\">Limiter la possibilit\u00e9 de \u00ab switch_user \u00bb en fonction du r\u00f4le de l\u2019utilisateur cible.<\/a> <\/p>\n<p><a href=\"https:\/\/www.remipoignon.fr\/symfony-comment-verifier-le-role-dun-utilisateur-en-respectant-la-hierarchie-des-roles\/\">Source<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article est \u00e9crit pour la version 5 de Symfony mais \u00e0 priori il devrait aussi fonctionner au moins pour les version 3 et 4 du framework Sous Symfony la fonction permettant de savoir si l&rsquo;utilisateur en train de parcourir l&rsquo;application poss\u00e8de un certain r\u00f4le est \u00ab\u00a0isGranted\u00a0\u00bb elle est directement disponible \u00e0 l&rsquo;utilisation dans les [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-546","post","type-post","status-publish","format-standard","hentry","category-developpement","category-symfony"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Symfony 5 : Utiliser la fonction &quot;isGranted&quot; sur n&#039;importe quel objet utilisateur - Pense b\u00eate d&#039;un d\u00e9veloppeur web<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Symfony 5 : Utiliser la fonction &quot;isGranted&quot; sur n&#039;importe quel objet utilisateur - Pense b\u00eate d&#039;un d\u00e9veloppeur web\" \/>\n<meta property=\"og:description\" content=\"Cet article est \u00e9crit pour la version 5 de Symfony mais \u00e0 priori il devrait aussi fonctionner au moins pour les version 3 et 4 du framework Sous Symfony la fonction permettant de savoir si l&rsquo;utilisateur en train de parcourir l&rsquo;application poss\u00e8de un certain r\u00f4le est \u00ab\u00a0isGranted\u00a0\u00bb elle est directement disponible \u00e0 l&rsquo;utilisation dans les [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/\" \/>\n<meta property=\"og:site_name\" content=\"Pense b\u00eate d&#039;un d\u00e9veloppeur web\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-19T09:33:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-01-25T12:49:30+00:00\" \/>\n<meta name=\"author\" content=\"Numa\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Numa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/\"},\"author\":{\"name\":\"Numa\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e\"},\"headline\":\"Symfony 5 : Utiliser la fonction \u00ab\u00a0isGranted\u00a0\u00bb sur n&rsquo;importe quel objet utilisateur\",\"datePublished\":\"2020-01-19T09:33:38+00:00\",\"dateModified\":\"2020-01-25T12:49:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/\"},\"wordCount\":546,\"commentCount\":2,\"articleSection\":[\"D\u00e9veloppement\",\"Symfony\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/\",\"url\":\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/\",\"name\":\"Symfony 5 : Utiliser la fonction \\\"isGranted\\\" sur n'importe quel objet utilisateur - Pense b\u00eate d&#039;un d\u00e9veloppeur web\",\"isPartOf\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#website\"},\"datePublished\":\"2020-01-19T09:33:38+00:00\",\"dateModified\":\"2020-01-25T12:49:30+00:00\",\"author\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e\"},\"breadcrumb\":{\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/numa-bord.com\/miniblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Symfony 5 : Utiliser la fonction \u00ab\u00a0isGranted\u00a0\u00bb sur n&rsquo;importe quel objet utilisateur\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#website\",\"url\":\"https:\/\/numa-bord.com\/miniblog\/\",\"name\":\"Pense b\u00eate d&#039;un d\u00e9veloppeur web\",\"description\":\"(php, javascript, Symfony, Wordpress....)\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/numa-bord.com\/miniblog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e\",\"name\":\"Numa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g\",\"caption\":\"Numa\"},\"url\":\"https:\/\/numa-bord.com\/miniblog\/author\/negonner\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Symfony 5 : Utiliser la fonction \"isGranted\" sur n'importe quel objet utilisateur - Pense b\u00eate d&#039;un d\u00e9veloppeur web","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/","og_locale":"fr_FR","og_type":"article","og_title":"Symfony 5 : Utiliser la fonction \"isGranted\" sur n'importe quel objet utilisateur - Pense b\u00eate d&#039;un d\u00e9veloppeur web","og_description":"Cet article est \u00e9crit pour la version 5 de Symfony mais \u00e0 priori il devrait aussi fonctionner au moins pour les version 3 et 4 du framework Sous Symfony la fonction permettant de savoir si l&rsquo;utilisateur en train de parcourir l&rsquo;application poss\u00e8de un certain r\u00f4le est \u00ab\u00a0isGranted\u00a0\u00bb elle est directement disponible \u00e0 l&rsquo;utilisation dans les [&hellip;]","og_url":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/","og_site_name":"Pense b\u00eate d&#039;un d\u00e9veloppeur web","article_published_time":"2020-01-19T09:33:38+00:00","article_modified_time":"2020-01-25T12:49:30+00:00","author":"Numa","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Numa","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#article","isPartOf":{"@id":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/"},"author":{"name":"Numa","@id":"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e"},"headline":"Symfony 5 : Utiliser la fonction \u00ab\u00a0isGranted\u00a0\u00bb sur n&rsquo;importe quel objet utilisateur","datePublished":"2020-01-19T09:33:38+00:00","dateModified":"2020-01-25T12:49:30+00:00","mainEntityOfPage":{"@id":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/"},"wordCount":546,"commentCount":2,"articleSection":["D\u00e9veloppement","Symfony"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/","url":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/","name":"Symfony 5 : Utiliser la fonction \"isGranted\" sur n'importe quel objet utilisateur - Pense b\u00eate d&#039;un d\u00e9veloppeur web","isPartOf":{"@id":"https:\/\/numa-bord.com\/miniblog\/#website"},"datePublished":"2020-01-19T09:33:38+00:00","dateModified":"2020-01-25T12:49:30+00:00","author":{"@id":"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e"},"breadcrumb":{"@id":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/numa-bord.com\/miniblog\/symfony-5-utiliser-la-fonction-isgranted-sur-nimporte-quel-objet-utilisateur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/numa-bord.com\/miniblog\/"},{"@type":"ListItem","position":2,"name":"Symfony 5 : Utiliser la fonction \u00ab\u00a0isGranted\u00a0\u00bb sur n&rsquo;importe quel objet utilisateur"}]},{"@type":"WebSite","@id":"https:\/\/numa-bord.com\/miniblog\/#website","url":"https:\/\/numa-bord.com\/miniblog\/","name":"Pense b\u00eate d&#039;un d\u00e9veloppeur web","description":"(php, javascript, Symfony, Wordpress....)","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/numa-bord.com\/miniblog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/numa-bord.com\/miniblog\/#\/schema\/person\/f9d00acd1703f17e5a6895283eb46a7e","name":"Numa","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f21d1af4658a7106211915940584534c1e0b3eef3f12eb67a697686cad70b64a?s=96&d=mm&r=g","caption":"Numa"},"url":"https:\/\/numa-bord.com\/miniblog\/author\/negonner\/"}]}},"_links":{"self":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts\/546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/comments?post=546"}],"version-history":[{"count":8,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts\/546\/revisions"}],"predecessor-version":[{"id":571,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/posts\/546\/revisions\/571"}],"wp:attachment":[{"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/media?parent=546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/categories?post=546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numa-bord.com\/miniblog\/wp-json\/wp\/v2\/tags?post=546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}