{"id":6136,"date":"2022-02-14T21:35:23","date_gmt":"2022-02-14T21:35:23","guid":{"rendered":"https:\/\/www.directimpactsolutions.com\/comment-utiliser-les-policies-dans-laravel\/"},"modified":"2025-05-01T05:27:33","modified_gmt":"2025-05-01T05:27:33","slug":"policies-dans-laravel","status":"publish","type":"post","link":"https:\/\/www.directimpactsolutions.com\/fr\/policies-dans-laravel\/","title":{"rendered":"Comment utiliser les \u201cPolicies\u201d dans Laravel"},"content":{"rendered":"<p><a href=\"https:\/\/www.directimpactsolutions.com\/fr\/laravel\/\">Laravel <\/a>policies peuvent rationaliser la cr\u00e9ation de mesures de s\u00e9curit\u00e9 de sites Web. La s\u00e9curit\u00e9 est un aspect important de la plupart des sites Web, en particulier ceux qui contiennent des informations sensibles ou confidentielles. La protection d\u2019un site commence par la s\u00e9curisation de la majorit\u00e9 du contenu derri\u00e8re une page de connexion. Nous pouvons \u00e9galement ajouter une authentification \u00e0 deux facteurs, des \u201creCAPTCHAS\u201d et d&rsquo;autres fonctions pour rendre la connexion plus sure. <\/p><p>Cependant, d&rsquo;autres consid\u00e9rations entrent en ligne de compte. Par exemple, si notre site contient des informations sur des entreprises et qu&rsquo;un ou plusieurs utilisateurs appartiennent \u00e0 une entreprise, nous ne voulons pas qu&rsquo;un utilisateur voie des informations sur une entreprise \u00e0 laquelle il n&rsquo;appartient pas. Nous ne voulons pas non plus qu&rsquo;il supprime l&rsquo;enregistrement de l&rsquo;entreprise ou son propre enregistrement d&rsquo;utilisateur, car cela peut entrainer des probl\u00e8mes sur notre site Web. Si nous disposons \u00e9galement d&rsquo;une table pour les commandes, et que les commandes sont associ\u00e9es \u00e0 une soci\u00e9t\u00e9, un utilisateur ne doit pouvoir afficher ou modifier que les commandes associ\u00e9es \u00e0 sa soci\u00e9t\u00e9.<\/p><h2 class=\"wp-block-heading\">Mise en place de la s\u00e9curit\u00e9<\/h2><p>Supposons que nous ayons deux r\u00f4les de base &#8211; Administrateur et Client. Nous pourrions vouloir configurer notre s\u00e9curit\u00e9 comme suit :<\/p><figure class=\"wp-block-table\"><table><tbody><tr><td>Administrateur<\/td><td>Afficher\/Modifier\/Supprimer tous les utilisateurs, Cr\u00e9er des utilisateurs<br\/>Afficher\/Modifier\/Supprimer les soci\u00e9t\u00e9s, Cr\u00e9er des soci\u00e9t\u00e9s<br\/>Afficher\/Modifier\/Supprimer toutes les commandes, Cr\u00e9er des commandes<\/td><\/tr><tr><td>Client<\/td><td>Afficher tous les utilisateurs associ\u00e9s \u00e0 leur soci\u00e9t\u00e9, modifier leurs informations d\u2019utilisateur.<br\/>Afficher\/modifier l\u2019enregistrement de la soci\u00e9t\u00e9<br\/>Afficher\/modifier les commandes de leur soci\u00e9t\u00e9, cr\u00e9er des commandes.<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">R\u00f4les de s\u00e9curit\u00e9<\/figcaption><\/figure><p>Il y a plusieurs fa\u00e7ons d&rsquo;y parvenir. Nous pouvons placer la logique dans les contr\u00f4leurs des utilisateurs, des entreprises et des commandes. Par exemple, nous pourrions avoir cette m\u00e9thode dans le contr\u00f4leur de la commande :<\/p><pre class=\"wp-block-code\"><code>    public function index() {\n        switch (Auth::user()-&gt;role) {\n            case 'Client':\n                $orders = Order::where('company_id', '=', Auth::user()-&gt;company_id)-&gt;get();\n                break;\n            case 'Administrator':\n                $orders = Order::all();\n            default:\n                $orders = null;\n                break;\n        }\n        return view('Orders.Index',&#91;'orders'=&gt;$orders]);\n    }\n<\/code><\/pre><p>Cela fonctionne bien, mais ce ne sera pas le seul endroit o\u00f9 nous aurons besoin d&rsquo;obtenir des enregistrements d&rsquo;utilisateurs sur le site Web. Nous devrions donc modifier chaque requ\u00eate pour les utilisateurs dans le syst\u00e8me afin de v\u00e9rifier le r\u00f4le de l&rsquo;utilisateur connect\u00e9, et ajouter cette clause suppl\u00e9mentaire. Ce n&rsquo;est pas tr\u00e8s efficace, et il serait facile de rater une requ\u00eate, surtout pour un nouveau d\u00e9veloppeur du projet qui ne connait pas toutes les facettes du syst\u00e8me. En outre, nous aurons tr\u00e8s probablement plusieurs tables qui n\u00e9cessitent ce type de s\u00e9curit\u00e9. D\u00e9couvrez les meilleures pratiques <a href=\"https:\/\/www.directimpactsolutions.com\/fr\/aide-memoire-sur-les-applications-web-progressives\/\">ici<\/a>.<\/p><h2 class=\"wp-block-heading\">Cr\u00e9ation de Policies<\/h2><p>Au lieu de cela, nous pouvons utiliser des Policies. Il s\u2019agit de classes qui organisent la logique d&rsquo;autorisation autour d&rsquo;un mod\u00e8le ou d&rsquo;une ressource particuli\u00e8re. Dans notre exemple, nous allons en cr\u00e9er pour les utilisateurs et les entreprises. Les Policies sont g\u00e9n\u00e9r\u00e9es en utilisant la commande <code>make:policy Artisan<\/code>. Cela cr\u00e9era une classe de Policies vide dans le r\u00e9pertoire <code>app\/Policies<\/code>. Si vous voulez en cr\u00e9er une avec des exemples de m\u00e9thodes de politique li\u00e9es \u00e0 la visualisation, la cr\u00e9ation, la mise \u00e0 jour et la suppression de la ressource, vous pouvez utiliser l&rsquo;option <code>--model<\/code>.<\/p><p>Pour g\u00e9n\u00e9rer les strat\u00e9gies pour les mod\u00e8les de notre exemple, nous utiliserons les commandes suivantes :<\/p><pre class=\"wp-block-code\"><code>php artisan make:policy UserPolicy --model=User\nphp artisan make:policy CompanyPolicy --model=Company\nphp artisan make:policy OrderPolicy --model=Order<\/code><\/pre><h2 class=\"wp-block-heading\">Politique de d\u00e9nomination<\/h2><p>En g\u00e9n\u00e9ral, nous recommandons de nommer votre Policy en fonction du nom du mod\u00e8le, par exemple <code>UserPolicy<\/code>. En proc\u00e9dant ainsi, Laravel associera automatiquement la Policy au bon mod\u00e8le. Si vous souhaitez la nommer autrement, vous pouvez modifier <code>App\\Providers\\AuthServiceProvider<\/code> en mappant vos Policies au mod\u00e8le correct.<\/p><pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\Providers;\n\nuse App\\Models\\Order;\nuse App\\Policies\\OrderPolicy;\nuse Illuminate\\Foundation\\Support\\Providers\\AuthServiceProvider as ServiceProvider;\nuse Illuminate\\Support\\Facades\\Gate;\n\nclass AuthServiceProvider extends ServiceProvider\n{\n    \/**\n     * The policy mappings for the application.\n     *\n     * @var array\n     *\/\n    protected $policies = &#91;\n        Order::class =&gt; OrderPolicy::class,\n    ];\n\n    \/**\n     * Register any application authentication \/ authorization services.\n     *\n     * @return void\n     *\/\n    public function boot()\n    {\n        $this-&gt;registerPolicies();\n\n        \/\/\n    }\n}<\/code><\/pre><h2 class=\"wp-block-heading\">Ajout de r\u00e8gles de s\u00e9curit\u00e9 \u00e0 la Policy<\/h2><p>Maintenant que la Policy a \u00e9t\u00e9 cr\u00e9\u00e9e, nous pouvons configurer la s\u00e9curit\u00e9 de nos mod\u00e8les. Nous allons configurer l&rsquo;OrderPolicy \u00e0 titre d&rsquo;exemple. Si l&rsquo;on se r\u00e9f\u00e8re \u00e0 l&rsquo;exemple ci-dessus, les administrateurs peuvent afficher\/modifier\/supprimer tous les enregistrements de commande et cr\u00e9er des commandes, tandis que les clients peuvent afficher\/modifier les commandes de leur soci\u00e9t\u00e9 et cr\u00e9er des commandes. <\/p><p>En regardant l&rsquo;exemple de code pour le contr\u00f4leur cr\u00e9\u00e9 ci-dessus, les utilisateurs clients peuvent visualiser et modifier tous les enregistrements de commande dont la valeur dans la colonne company_id correspond \u00e0 la valeur dans leur colonne company_id. Pour chaque m\u00e9thode de l&rsquo;OrderPolicy, deux param\u00e8tres sont pass\u00e9s. Le param\u00e8tre $user est le mod\u00e8le de l&rsquo;utilisateur connect\u00e9, tandis que le param\u00e8tre $order est le mod\u00e8le de la commande. <\/p><p>Un exemple de OrderPolicy bas\u00e9 sur les r\u00e8gles que nous avons d\u00e9finies ressemblerait \u00e0 ceci :<\/p><pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\Policies;\n\nuse App\\Models\\Order;\nuse App\\Models\\User;\nuse Illuminate\\Auth\\Access\\HandlesAuthorization;\n\nclass OrderPolicy\n{\n    use HandlesAuthorization;\n\n    \/**\n     * Determine whether the user can view the model.\n     *\n     * @param  \\App\\Models\\User  $user\n     * @param  \\App\\Models\\Order  $order\n     * @return \\Illuminate\\Auth\\Access\\Response|bool\n     *\/\n    public function view(User $user, Order $order)\n    {\n        switch ($user-&gt;role) {\n            case 'Administrator':\n                return true;\n            case 'Client':\n                return $order-&gt;company_id === $user-&gt;company_id;\n            default:\n                return false;\n        }\n    }\n\n    \/**\n     * Determine whether the user can create models.\n     *\n     * @param  \\App\\Models\\User  $user\n     * @return \\Illuminate\\Auth\\Access\\Response|bool\n     *\/\n    public function create(User $user)\n    {\n        return true;\n    }\n\n    \/**\n     * Determine whether the user can update the model.\n     *\n     * @param  \\App\\Models\\User  $user\n     * @param  \\App\\Models\\Order  $order\n     * @return \\Illuminate\\Auth\\Access\\Response|bool\n     *\/\n    public function update(User $user, Order $order)\n    {\n        switch ($user-&gt;role) {\n            case 'Administrator':\n                return true;\n            case 'Client':\n                return $order-&gt;company_id === $user-&gt;company_id;\n            default:\n                return false;\n        }\n    }\n\n    \/**\n     * Determine whether the user can delete the model.\n     *\n     * @param  \\App\\Models\\User  $user\n     * @param  \\App\\Models\\Order  $order\n     * @return \\Illuminate\\Auth\\Access\\Response|bool\n     *\/\n    public function delete(User $user, Order $order)\n    {\n        switch ($user-&gt;role) {\n            case 'Administrator':\n                return true;\n            default:\n                return false;\n        }\n    }\n}\n<\/code><\/pre><p>Chaque fois qu&rsquo;une requ\u00eate est ex\u00e9cut\u00e9e sur la table Order, la m\u00e9thode appropri\u00e9e est v\u00e9rifi\u00e9e dans la OrderPolicy. Si elle renvoie \u201cTrue\u201d, la requ\u00eate aboutit (ou dans le cas d\u2019une vue, l&rsquo;enregistrement de la commande est inclus dans le r\u00e9sultat). Si elle renvoie \u201cFalse\u201d, la requ\u00eate \u00e9choue (ou la commande ne sera pas incluse dans la vue).<\/p><p>Il s\u2019agit d\u2019un exemple assez simple, mais il nous donne une bonne id\u00e9e de ce qui est possible avec les Policies Pour plus de documentation et d&rsquo;exemples, vous pouvez vous r\u00e9f\u00e9rer \u00e0 la <a href=\"https:\/\/laravel.com\/docs\/8.x\/authorization#creating-policies\" target=\"_blank\" rel=\"noreferrer noopener\">documentation de Laravel<\/a>. Vous pouvez \u00e9galement en savoir plus sur nos projets et capacit\u00e9s Laravel <a href=\"https:\/\/www.directimpactsolutions.com\/fr\/laravel\/\">ici<\/a>.<\/p><p>Cette technique est le r\u00e9sultat de nos explorations. Il se peut qu\u2019elle ne s\u2019adapte pas \u00e0 vos besoins. Chaque technique a ses avantages et ses inconv\u00e9nients et nous vous invitons \u00e0 faire vos propres exp\u00e9riences et \u00e0 tirer vos propres conclusions en fonction de votre situation.<\/p>","protected":false},"excerpt":{"rendered":"<p>Laravel policies peuvent rationaliser la cr\u00e9ation de mesures de s\u00e9curit\u00e9 de sites Web. La s\u00e9curit\u00e9 est un aspect important de la plupart des sites Web, en particulier ceux qui contiennent des informations sensibles ou confidentielles. La protection d\u2019un site commence par la s\u00e9curisation de la majorit\u00e9 du contenu derri\u00e8re une page de connexion. Nous pouvons &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/www.directimpactsolutions.com\/fr\/policies-dans-laravel\/\"> <span class=\"screen-reader-text\">Comment utiliser les \u201cPolicies\u201d dans Laravel<\/span> Lire la suite >><\/a><\/p>\n","protected":false},"author":9,"featured_media":6205,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"","footnotes":""},"categories":[49,37],"tags":[154,365,364,366],"class_list":["post-6136","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-home-fr","category-web","tag-laravel-fr","tag-laravel-policies-fr","tag-policies-fr","tag-securite-site-web"],"uagb_featured_image_src":{"full":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr.png",600,340,false],"thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr-150x150.png",150,150,true],"medium":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr-300x170.png",300,170,true],"medium_large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr.png",600,340,false],"large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr.png",600,340,false],"1536x1536":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr.png",600,340,false],"2048x2048":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr.png",600,340,false],"woocommerce_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr-300x300.png",300,300,true],"woocommerce_single":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr.png",600,340,false],"woocommerce_gallery_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2022\/02\/policies-icon-fr-100x100.png",100,100,true]},"uagb_author_info":{"display_name":"Alan Bruce","author_link":"https:\/\/www.directimpactsolutions.com\/fr\/author\/alan-bruce\/"},"uagb_comment_info":0,"uagb_excerpt":"Laravel policies peuvent rationaliser la cr\u00e9ation de mesures de s\u00e9curit\u00e9 de sites Web. La s\u00e9curit\u00e9 est un aspect important de la plupart des sites Web, en particulier ceux qui contiennent des informations sensibles ou confidentielles. La protection d\u2019un site commence par la s\u00e9curisation de la majorit\u00e9 du contenu derri\u00e8re une page de connexion. Nous pouvons\u2026","_links":{"self":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/6136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/comments?post=6136"}],"version-history":[{"count":8,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/6136\/revisions"}],"predecessor-version":[{"id":21107,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/6136\/revisions\/21107"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media\/6205"}],"wp:attachment":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=6136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/categories?post=6136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/tags?post=6136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}