Symfony : – Sécurité – Authentification – Autorisations

01:19:39

La gestion des autorisations est essentielle pour sécuriser les ressources de votre application en limitant l’accès à certaines fonctionnalités ou sections en fonction des rôles des utilisateurs.

Les rôles : le cœur des autorisations

Les rôles permettent de contrôler l’accès des utilisateurs à des ressources ou des actions. En plus des rôles définis pour vos utilisateurs, Symfony attribue automatiquement des rôles spécifiques selon l’état d’authentification de l’utilisateur :

  • IS_AUTHENTICATED_ANONYMOUSLY

    : l’utilisateur est anonyme.

  • IS_AUTHENTICATED_REMEMBERED

    : l’utilisateur est authentifié grâce à la fonctionnalité « se souvenir de moi ».

  • IS_AUTHENTICATED_FULLY

    : l’utilisateur s’est authentifié avec succès pour la session en cours.

Ces rôles spéciaux ne sont pas définis dans la méthode

getRoles()

de votre entité utilisateur mais sont gérés en interne par Symfony.

Vérifier les rôles d’un utilisateur

Dans les contrôleurs

Pour vérifier si un utilisateur possède un rôle particulier, utilisez la méthode

isGranted()

:

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class DefaultController extends AbstractController
{
    #[Route('/')]
    public function index(): Response
    {
        if ($this->isGranted('ROLE_ADMIN')) {
            return new Response('Vous êtes un administrateur.');
        }
        if ($this->isGranted('ROLE_USER')) {
            return new Response('Bienvenue cher utilisateur.');
        }
        return new Response('Vous n\'êtes pas authentifié.');
    }
}

Dans les templates Twig

Dans les vues, utilisez la fonction Twig

is_granted()

pour vérifier les rôles :

{% if is_granted('ROLE_ADMIN') %}
    Vous êtes un administrateur.
{% else %}
    Vous n'êtes pas un administrateur.
{% endif %}

Sécuriser une action

Pour restreindre l’accès à une action dans un contrôleur, vous pouvez lancer une exception

AccessDeniedException

si l’utilisateur ne possède pas le rôle requis :

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class DefaultController extends AbstractController
{
    #[Route('/page-admin')]
    public function pageAdmin(): Response
    {
        if (!$this->isGranted('ROLE_ADMIN')) {
            throw new AccessDeniedException('Accès interdit');
        }

        return new Response('Bienvenue sur la page administrateur.');
    }
}

Sécuriser une section entière

Vous pouvez sécuriser une section complète de l’application en utilisant la directive

access_control

dans

security.yaml

:

security:
  access_control:
    - { path: ^/admin, roles: ROLE_ADMIN }

Dans cet exemple, toutes les routes commençant par

/admin

ne seront accessibles qu’aux administrateurs (

ROLE_ADMIN

).

Sécuriser avec des critères avancés

En plus des chemins (paths), vous pouvez utiliser d’autres critères pour sécuriser vos ressources :

a. Par nom d’hôte

Pour restreindre l’accès à un sous-domaine, utilisez l’option

host

:

security:
  access_control:
    - { host: ^admin\.example\.com$, roles: ROLE_ADMIN }
b. Forcer le protocole HTTPS Pour des sections nécessitant une connexion sécurisée (comme un paiement), utilisez requires_channel : security: access_control: - { path: ^/paiement, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } c. Par adresse IP ou méthode HTTP Vous pouvez également limiter l'accès par adresse IP ou méthode HTTP. Par exemple, pour autoriser uniquement un partenaire à utiliser une API : security: access_control: - { path: ^/api, ip: 11.22.33.44, methods: [POST], roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/api, roles: ROLE_FORBIDDEN } Dans ce cas : La première règle permet l’accès à l’IP spécifiée avec des requêtes POST. La deuxième règle refuse l’accès aux autres utilisateurs grâce à un rôle inexistant ( ROLE_FORBIDDEN ). Pour aller plus loin Symfony offre des fonctionnalités avancées pour gérer les autorisations, comme l'intégration avec LDAP, OAuth ou des systèmes de contrôle d'accès basés sur des listes (ACL). Pour en savoir plus, explorez la documentation officielle de Symfony Security. Les rôles sont centraux pour sécuriser les ressources dans Symfony. Utilisez isGranted() dans les contrôleurs ou is_granted() dans Twig pour vérifier les autorisations. Sécurisez des actions ou des sections entières avec access_control . Combinez des critères comme le chemin, l'adresse IP, le protocole HTTPS ou la méthode HTTP pour des besoins spécifiques. Cette approche modulaire permet de répondre à une large gamme de besoins en matière de sécurité.
par admin4460
Nom d'utilisateur Mot de passe Mot de passe oublié? Se connecter  SuivreSuivreSuivreSuivreSuivre window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-L58BSN4YKD'); © MyCreaNet 2025 – Mentions légales – Plan du site – Gestion des cookies – Accessibilité
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/Divi\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap:before, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper:before { content: "\45"; font-size: 27px; color: #ccffcc; font-family: ETModules; cursor: pointer; width: 28px; height: 27px; border-radius: 3px; padding-top: 1px; background-color: rgb(255, 255, 255, 0.2) !important; } .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-fb-form__group:nth-of-type(4) { display: none; } jQuery(document).ready(function($) { $(document).on('click', '.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper', function(event) { if (event.target !== event.currentTarget) { return; // Exit the function if the click is on a child element } var firstEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(0)?.CodeMirror; if (!firstEditor) { return; } $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] textarea[name="code_to_render"]').click(); // Enable hidden codemirror var secondEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(1)?.CodeMirror; if (!secondEditor) { return; } var content = firstEditor.getValue(); // Add a random nonce as the first line of content to prevent caching var nonce = Math.random().toString(36).substring(2, 15); content = '/* nonce:' + nonce + ' */\n' + content; secondEditor.setValue(content); }); }); (function() { var file = ["https:\/\/mycreanet.fr\/wp-content\/et-cache\/5006\/et-divi-dynamic-tb-8564-tb-7217-tb-6415-5006-late.css"]; var handle = document.getElementById('divi-style-inline-inline-css'); var location = handle.parentNode; if (0===document.querySelectorAll('link[href="' + file + '"]').length) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.id = 'et-dynamic-late-css'; link.href = file; location.insertBefore(link, handle.nextSibling); } })(); var et_link_options_data = [{"class":"et_pb_post_title_0_tb_header","url":"https:\/\/mycreanet.fr\/dashboard\/","target":"_self"},{"class":"et_pb_code_0_tb_header","url":"https:\/\/mycreanet.fr\/work\/","target":"_self"}]; /* <![CDATA[ */ wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); /* ]]> */ /* <![CDATA[ */ ( function( domain, translations ) { var localeData = translations.locale_data[ domain ] || translations.locale_data.messages; localeData[""].domain = domain; wp.i18n.setLocaleData( localeData, domain ); } )( "contact-form-7", {"translation-revision-date":"2025-02-06 12:02:14+0000","generator":"GlotPress\/4.0.1","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"This contact form is placed in the wrong place.":["Ce formulaire de contact est plac\u00e9 dans un mauvais endroit."],"Error:":["Erreur\u00a0:"]}},"comment":{"reference":"includes\/js\/index.js"}} ); /* ]]> */ /* <![CDATA[ */ var wpcf7 = { "api": { "root": "https:\/\/mycreanet.fr\/wp-json\/", "namespace": "contact-form-7\/v1" } }; /* ]]> */ /* <![CDATA[ */ var tocplus = {"smooth_scroll":"1","visibility_show":"Afficher","visibility_hide":"Masquer","width":"Auto"}; /* ]]> */ /* <![CDATA[ */ var DIVI = {"item_count":"%d Item","items_count":"%d Items"}; var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"}; var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"}; var et_pb_custom = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/images","builder_images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/images","et_frontend_nonce":"87db64130d","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"5e9a8fb1e0","fill_message":"S'il vous pla\u00eet, remplissez les champs suivants:","contact_error_message":"Veuillez corriger les erreurs suivantes :","invalid":"E-mail non valide","captcha":"Captcha","prev":"Pr\u00e9c\u00e9dent","previous":"Pr\u00e9c\u00e9dente","next":"Prochaine","wrong_captcha":"Vous avez entr\u00e9 le mauvais num\u00e9ro dans le captcha.","wrong_checkbox":"Case \u00e0 cocher","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"5006","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"no","is_shortcode_tracking":"","tinymce_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/frontend-builder\/assets\/vendors","accent_color":"#006666","waypoints_options":[]}; var et_pb_box_shadow_elements = []; /* ]]> */ /* <![CDATA[ */ var DiviBlogExtrasFrontendData = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","ajax_nonce":"963937941b","et_theme_accent_color":"#006666"}; /* ]]> */ /* <![CDATA[ */ var wpcf7_recaptcha = { "sitekey": "6LdTHXQrAAAAACmbbt7TJPkqCEfzcO8TdF_cEKX-", "actions": { "homepage": "homepage", "contactform": "contactform" } }; /* ]]> */ .wptpa_song_infrmtn, .wptpa_currenttime, .wptpa_duration, .wptpa_song, .wptpa_dwn_cnt, .wptpa_play_cnt, .wptpa_num, .wptpa_h2, .wptpa_ads{ font-family: 'Roboto', sans-serif; } .wptpa_player { background: #FFFFFF !important; } .wptpa_heading:before, .wptpa_heading:after { background: #000000 !important; } .wptpa_song_infrmtn { color: #000000 !important; } .wptpa_btn .wptpa_icon { fill: #555555; } .wptpa_btn.actv .wptpa_icon, .wptpa_btn:hover .wptpa_icon{ fill: #00D084; } .wptpa_btn:before{ background: #555555 !important; } .wptpa_player .wptpa_seek, .wptpa_player .wptpa_loader { background: #FFDA48 !important; } .wptpa_player .wptpa_seek span, .wptpa_progress { background: #CF2E2E !important; } .wptpa_ads, .wptpa_currenttime, .wptpa_duration { color: #FFFFFF !important; } .wptpa_volume_seek:before { background: #FFDA48 !important; } .wptpa_volume_value { background: #CF2E2E !important; } .wptpa_pllst_itm { border-bottom: 1px solid rgba(255, 255, 255, 0.25) !important; background: #23C5A3 !important; color: #000000 !important; } .wptpa_pllst_itm.crrnt, .wptpa_pllst_itm:hover { background: #FFDA48 !important; color: #000000 !important; } .wptpa_pllst_itm:last-child { border-bottom: 0px solid rgba(255, 255, 255, 0.25) !important; } .wptpa_bars, .wptpa_bars:before, .wptpa_bars:after{ background: #000000 !important; } .wptpa_line { border-color: #000000 !important; } .wptpa_pllst_itm .wptpa_icon { fill: #000000; } .wptpa_dwn_cnt, .wptpa_play_cnt { color: #000000 !important; } .wptpa_scroll_bar { background: #000000 !important; }