{"id":529,"date":"2015-08-13T18:52:13","date_gmt":"2015-08-13T17:52:13","guid":{"rendered":"http:\/\/louis.hatier.me\/blog\/?p=529"},"modified":"2018-08-31T14:46:24","modified_gmt":"2018-08-31T13:46:24","slug":"symfony2-gerer-lidentification-utilisateur-ldap","status":"publish","type":"post","link":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/","title":{"rendered":"Symfony2 : g\u00e9rer l&rsquo;identification utilisateur LDAP"},"content":{"rendered":"<p><a href=\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg\" data-rel=\"lightbox-gallery-JZz37Wvd\" data-rl_title=\"\" data-rl_caption=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-513 size-full\" title=\"\" src=\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg\" alt=\"Logo Symfony\" width=\"219\" height=\"80\" \/><\/a>Il est possible avec Symfony2 d\u2019authentifier l\u2019utilisateur LDAP.<br \/>\nPour cela il faut cr\u00e9er une premi\u00e8re classe <code>UserProvider<\/code> qui sera le fournisseur d\u2019utilisateur, et une seconde classe <code>User<\/code> qui sera notre utilisateur.<br \/>\nCette article d\u00e9taill\u00e9 en explique le fonctionnement : <a href=\"http:\/\/symfony.com\/fr\/doc\/current\/cookbook\/security\/custom_provider.html\" target=\"_blank\" rel=\"noopener\">http:\/\/symfony.com\/fr\/doc\/current\/cookbook\/security\/custom_provider.html<\/a><\/p>\n<p><!--more--><\/p>\n<p>Tout d\u2019abord, on va renseigner dans le fichier <code>app\/config\/security.yml<\/code> la fa\u00e7on dont on va authentifi\u00e9 l\u2019utilisateur.<\/p>\n<pre><code class=\"yaml\">security:\r\n    providers:\r\n        ldap:\r\n            id: user_provider\r\n\r\n    firewalls:\r\n        secured_area:\r\n            pattern: ^\/\r\n            remote_user:\r\n                provider: ldap\r\n<\/code><\/pre>\n<p>On va retrouver la clef \u00ab\u00a0user_provider\u00a0\u00bb dans notre fichier de d\u00e9claration des services <code>app\/config\/services.yml<\/code><\/p>\n<pre><code class=\"yaml\">services:\r\n    ad:\r\n        class: AppBundleUtilsAd\r\n        arguments: [\"%ad_host%\", \"%ad_user%\", \"%ad_password%\"]\r\n    user_provider:\r\n        class: AppBundleSecurityUserProvider\r\n        calls:\r\n            - [setAd, [\"@ad\"]]\r\n<\/code><\/pre>\n<p>Le service \u00ab\u00a0ad\u00a0\u00bb est une classe qui me permet d\u2019aller chercher les informations utilisateur dans l\u2019Active Directory (nom, pr\u00e9nom, description etc.), c\u2019est pourquoi je l\u2019injecte dans ma classe <code>UserProvider<\/code>.<\/p>\n<p>Voici le contenu des classes <code>UserProvider<\/code> et <code>User<\/code> :<\/p>\n<pre><code class=\"php\">namespace AppBundle\\Security;\r\n\r\nuse AppBundle\\Utils\\Ad;\r\nuse Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException;\r\nuse Symfony\\Component\\Security\\Core\\Exception\\UnsupportedUserException;\r\nuse Symfony\\Component\\Security\\Core\\User\\UserProviderInterface;\r\n\r\nclass UserProvider implements UserProviderInterface\r\n{\r\n    private $ad;\r\n\r\n    \/**\r\n     * @param string $username\r\n     * @return UserInterface\r\n     * @throws UsernameNotFoundException\r\n     *\/\r\n    public function loadUserByUsername($username)\r\n    {\r\n        if ($userAd = $this-&gt;getAd()-&gt;getUserByLogin($username)) {\r\n            return new User($userAd-&gt;samaccountname, $userAd);\r\n        }\r\n\r\n        throw new UsernameNotFoundException('Utilisateur \"' . $username . '\" introuvable');\r\n    }\r\n\r\n    \/**\r\n     * @param UserInterface $user\r\n     * @return UserInterface\r\n     * @throws UnsupportedUserException\r\n     *\/\r\n    public function refreshUser(UserInterface $user)\r\n    {\r\n        if (!$user instanceof User) {\r\n            throw new UnsupportedUserException('Instance \"' . get_class($user) . '\" non support\u00e9e');\r\n        }\r\n\r\n        return $this-&gt;loadUserByUsername($user-&gt;getUsername());\r\n    }\r\n\r\n    \/**\r\n     * @param string $class\r\n     * @return bool\r\n     *\/\r\n    public function supportsClass($class)\r\n    {\r\n        return $class === 'AppBundle\\Security\\User';\r\n    }\r\n\r\n    \/**\r\n     * @param Ad $ad\r\n     * @return void\r\n     *\/\r\n    public function setAd(Ad $ad)\r\n    {\r\n        $this-&gt;ad = $ad;\r\n    }\r\n\r\n    \/**\r\n     * @return Ad $ad\r\n     *\/\r\n    public function getAd()\r\n    {\r\n        return $this-&gt;ad;\r\n    }\r\n}\r\n<\/code><\/pre>\n<pre><code class=\"php\">namespace AppBundle\\Security;\r\n\r\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\r\nuse Symfony\\Component\\Security\\Core\\Role\\Role;\r\nuse AppBundle\\Utils\\UserAd;\r\n\r\nclass User implements UserInterface\r\n{\r\n    private $username;\r\n    private $password;\r\n    private $roles = array();\r\n    private $nom;\r\n    private $prenom;\r\n    private $description;\r\n\r\n    \/**\r\n     * @param string $username\r\n     * @param UserAd $userAd\r\n     * @return User\r\n     *\/\r\n    public function __construct($username, UserAd $userAd)\r\n    {\r\n        $this-&gt;username = $username;\r\n        $this-&gt;nom = $userAd-&gt;sn;\r\n        $this-&gt;prenom = $userAd-&gt;givenname;\r\n        $this-&gt;description = $userAd-&gt;description;\r\n\r\n        \/\/ \u00e9tablit les r\u00f4les\r\n        $roles = array('ROLE_USER');\r\n\r\n        if ($this-&gt;getUsername() === 'jdoe') {\r\n            $roles[] = 'ROLE_SUPER_ADMIN';\r\n        }\r\n\r\n        $this-&gt;setRoles($roles);\r\n    }\r\n\r\n    \/**\r\n     * @return string\r\n     *\/\r\n    public function getUsername()\r\n    {\r\n        return $this-&gt;username;\r\n    }\r\n\r\n    \/**\r\n     * @return string\r\n     *\/\r\n    public function getPassword()\r\n    {\r\n        return $this-&gt;password;\r\n    }\r\n\r\n    \/**\r\n     * @return Role[] The user roles\r\n     *\/\r\n    public function getRoles()\r\n    {\r\n        $roles = $this-&gt;roles;\r\n\r\n        if (empty($roles)) {\r\n            $roles[] = 'ROLE_USER';\r\n        }\r\n\r\n        return array_unique($roles);\r\n    }\r\n\r\n    \/**\r\n     * @param array\r\n     * @return void\r\n     *\/\r\n    public function setRoles(array $roles)\r\n    {\r\n        $this-&gt;roles = $roles;\r\n    }\r\n\r\n    \/**\r\n     * @return void\r\n     *\/\r\n    public function getSalt()\r\n    {\r\n        return;\r\n    }\r\n\r\n    \/**\r\n     * @return void\r\n     *\/\r\n    public function eraseCredentials()\r\n    {\r\n    }\r\n\r\n    \/**\r\n     * @return string\r\n     *\/\r\n    public function getNom()\r\n    {\r\n        return $this-&gt;nom;\r\n    }\r\n\r\n    \/**\r\n     * @return string\r\n     *\/\r\n    public function getPrenom()\r\n    {\r\n        return $this-&gt;prenom;\r\n    }\r\n\r\n    \/**\r\n     * @return string\r\n     *\/\r\n    public function getDescription()\r\n    {\r\n        return $this-&gt;description;\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Ces deux classes doivent imp\u00e9rativement d\u00e9finir les m\u00e9thodes des interfaces <code>UserProviderInterface<\/code> et <code>User<\/code>.<\/p>\n<p>Cet exemple est \u00e0 adapt\u00e9 selon votre syst\u00e8me LDAP.<\/p>\n<p>Le fichier de log <code>access.log<\/code> d&rsquo;Apache affichera le login AD de la personne qui lance l&rsquo;appel HTTP, cela peut vous permettre d&rsquo;isoler ce champ dans un <a href=\"http:\/\/louis.hatier.me\/blog\/monitoring-elastic-stack\/\">dashboard Kibana<\/a>.<\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/dot.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"pinterest\",\"email\",\"linkedin\");var hupso_counters_lang = \"en_US\";var hupso_image_folder_url = \"\";var hupso_url_c=\"\";var hupso_title_c=\"Symfony2%20%3A%20g%C3%A9rer%20l%27identification%20utilisateur%20LDAP\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>Il est possible avec Symfony2 d\u2019authentifier l\u2019utilisateur LDAP. Pour cela il faut cr\u00e9er une premi\u00e8re classe UserProvider qui sera le fournisseur d\u2019utilisateur, et une seconde classe User qui sera notre utilisateur. Cette article d\u00e9taill\u00e9 en explique le fonctionnement : http:\/\/symfony.com\/fr\/doc\/current\/cookbook\/security\/custom_provider.html<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[79,54,76,57,18],"class_list":["post-529","post","type-post","status-publish","format-standard","hentry","category-php","tag-elastic-stack","tag-ldap","tag-monitoring","tag-php","tag-symfony"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Symfony2 : g\u00e9rer l&#039;identification utilisateur LDAP - Melting Poutre<\/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:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Symfony2 : g\u00e9rer l&#039;identification utilisateur LDAP - Melting Poutre\" \/>\n<meta property=\"og:description\" content=\"Il est possible avec Symfony2 d\u2019authentifier l\u2019utilisateur LDAP. Pour cela il faut cr\u00e9er une premi\u00e8re classe UserProvider qui sera le fournisseur d\u2019utilisateur, et une seconde classe User qui sera notre utilisateur. Cette article d\u00e9taill\u00e9 en explique le fonctionnement : http:\/\/symfony.com\/fr\/doc\/current\/cookbook\/security\/custom_provider.html\" \/>\n<meta property=\"og:url\" content=\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/\" \/>\n<meta property=\"og:site_name\" content=\"Melting Poutre\" \/>\n<meta property=\"article:published_time\" content=\"2015-08-13T17:52:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-08-31T13:46:24+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg\" \/>\n<meta name=\"author\" content=\"Louis Hatier\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Louis Hatier\" \/>\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:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/\"},\"author\":{\"name\":\"Louis Hatier\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\"},\"headline\":\"Symfony2 : g\u00e9rer l&rsquo;identification utilisateur LDAP\",\"datePublished\":\"2015-08-13T17:52:13+00:00\",\"dateModified\":\"2018-08-31T13:46:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/\"},\"wordCount\":181,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\"},\"image\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg\",\"keywords\":[\"Elastic Stack\",\"LDAP\",\"Monitoring\",\"PHP\",\"Symfony\"],\"articleSection\":[\"PHP\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/\",\"url\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/\",\"name\":\"Symfony2 : g\u00e9rer l'identification utilisateur LDAP - Melting Poutre\",\"isPartOf\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg\",\"datePublished\":\"2015-08-13T17:52:13+00:00\",\"dateModified\":\"2018-08-31T13:46:24+00:00\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage\",\"url\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg\",\"contentUrl\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg\"},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/#website\",\"url\":\"https:\/\/louis.hatier.me\/blog\/\",\"name\":\"Melting Poutre\",\"description\":\"Du web et d&#039;autres choses\",\"publisher\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/louis.hatier.me\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\",\"name\":\"Louis Hatier\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g\",\"caption\":\"Louis Hatier\"},\"logo\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/louis.hatier.me\",\"https:\/\/www.linkedin.com\/in\/louishatier\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Symfony2 : g\u00e9rer l'identification utilisateur LDAP - Melting Poutre","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:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/","og_locale":"fr_FR","og_type":"article","og_title":"Symfony2 : g\u00e9rer l'identification utilisateur LDAP - Melting Poutre","og_description":"Il est possible avec Symfony2 d\u2019authentifier l\u2019utilisateur LDAP. Pour cela il faut cr\u00e9er une premi\u00e8re classe UserProvider qui sera le fournisseur d\u2019utilisateur, et une seconde classe User qui sera notre utilisateur. Cette article d\u00e9taill\u00e9 en explique le fonctionnement : http:\/\/symfony.com\/fr\/doc\/current\/cookbook\/security\/custom_provider.html","og_url":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/","og_site_name":"Melting Poutre","article_published_time":"2015-08-13T17:52:13+00:00","article_modified_time":"2018-08-31T13:46:24+00:00","og_image":[{"url":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg","type":"","width":"","height":""}],"author":"Louis Hatier","twitter_misc":{"\u00c9crit par":"Louis Hatier","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#article","isPartOf":{"@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/"},"author":{"name":"Louis Hatier","@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11"},"headline":"Symfony2 : g\u00e9rer l&rsquo;identification utilisateur LDAP","datePublished":"2015-08-13T17:52:13+00:00","dateModified":"2018-08-31T13:46:24+00:00","mainEntityOfPage":{"@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/"},"wordCount":181,"commentCount":0,"publisher":{"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11"},"image":{"@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage"},"thumbnailUrl":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg","keywords":["Elastic Stack","LDAP","Monitoring","PHP","Symfony"],"articleSection":["PHP"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/","url":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/","name":"Symfony2 : g\u00e9rer l'identification utilisateur LDAP - Melting Poutre","isPartOf":{"@id":"https:\/\/louis.hatier.me\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage"},"image":{"@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage"},"thumbnailUrl":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg","datePublished":"2015-08-13T17:52:13+00:00","dateModified":"2018-08-31T13:46:24+00:00","inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/louis.hatier.me\/blog\/symfony2-gerer-lidentification-utilisateur-ldap\/#primaryimage","url":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg","contentUrl":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-symfony.jpg"},{"@type":"WebSite","@id":"https:\/\/louis.hatier.me\/blog\/#website","url":"https:\/\/louis.hatier.me\/blog\/","name":"Melting Poutre","description":"Du web et d&#039;autres choses","publisher":{"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/louis.hatier.me\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11","name":"Louis Hatier","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g","caption":"Louis Hatier"},"logo":{"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/louis.hatier.me","https:\/\/www.linkedin.com\/in\/louishatier\/"]}]}},"_links":{"self":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts\/529","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/comments?post=529"}],"version-history":[{"count":8,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts\/529\/revisions"}],"predecessor-version":[{"id":755,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts\/529\/revisions\/755"}],"wp:attachment":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/media?parent=529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/categories?post=529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/tags?post=529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}