RGPD & Consentement aux cookies
Une boîte à outils complète de conformité RGPD pour votre site Larapen. Affichez une bannière de consentement aux cookies personnalisable, enregistrez les décisions de consentement des visiteurs pour la conformité d’audit, et gérez les catégories de cookies depuis le panneau d’administration.
Bannière de consentement aux cookies
Une bannière soignée et responsive avec les options Tout accepter, Tout refuser et Personnaliser. Sept variantes de position incluant le mode modal.
Catégories granulaires
Quatre catégories de cookies (Essentiels, Analytiques, Marketing, Préférences) avec des contrôles de bascule par catégorie pour les visiteurs.
Journalisation du consentement
Piste d’audit complète de chaque décision de consentement : adresse IP, agent utilisateur, action effectuée et catégories sélectionnées. Conforme à l’article 7 du RGPD.
Auto-injection
La bannière est automatiquement injectée dans toutes les pages front-end via un middleware. Aucune modification de modèle nécessaire. Ignore le panneau admin et les requêtes AJAX.
Cas d’utilisation
Conformité des sites web UE/EEE
Votre site sert des visiteurs dans l’Union européenne et doit se conformer au RGPD et à la directive ePrivacy.
- Activez la bannière de consentement aux cookies pour informer les visiteurs de l’utilisation des cookies.
- Activez la journalisation du consentement pour maintenir un registre auditable de toutes les décisions de consentement.
- Liez votre page de politique de confidentialité afin que les visiteurs puissent consulter vos pratiques en matière de données.
- Configurez les bascules de catégories pour que les visiteurs puissent accepter/refuser les cookies analytiques et marketing.
Site avec beaucoup d’analyses
Vous utilisez Google Analytics, Hotjar ou des outils similaires et avez besoin du consentement de l’utilisateur avant de charger les scripts de suivi.
- Activez la bascule de la catégorie Analytiques.
- Lisez la valeur du cookie de consentement (
gdpr_consent) dans votre JavaScript avant de charger les scripts d’analyse. - Ne chargez les analyses que lorsque
categories.analytics === true.
Marketing & Reciblage publicitaire
Vous utilisez Facebook Pixel, Google Ads ou des outils de marketing par e-mail qui définissent des cookies.
- Activez la bascule de la catégorie Marketing.
- Conditionnez tous les scripts marketing/publicitaires au drapeau de consentement
marketing. - Les visiteurs peuvent révoquer leur consentement à tout moment via le point de terminaison de retrait.
Prérequis
- Larapen CMS v1.0.0 ou ultérieur
- PHP 8.3+
- MySQL 8.0+
Installation
Étape 1 : Placer l’add-on
Copiez ou créez un lien symbolique du dossier gdpr dans votre répertoire Larapen « extensions/addons » :
Étape 2 : Activer l’add-on
Allez dans Admin → Add-ons → Add-ons installés et activez RGPD & Consentement aux cookies.
Étape 3 : Exécuter les migrations
Cela crée la table gdpr_consent_logs pour stocker les enregistrements d’audit du consentement.
Étape 4 : Définir les permissions
L’add-on enregistre 4 permissions (voir Permissions). Assignez-les aux rôles admin via Admin → Utilisateurs → Rôles & Permissions.
Étape 5 : Configurer
Naviguez vers Admin → RGPD → Paramètres pour configurer la position de la bannière, la durée de vie du cookie, la journalisation du consentement et les catégories de cookies. Voir Configuration pour les détails.
Configuration
Tous les paramètres sont gérés dans Admin → RGPD → Paramètres
(stockés dans la table settings, groupe gdpr).
Les valeurs par défaut proviennent de config/gdpr.php.
| Paramètre | Description | Par défaut |
|---|---|---|
gdpr_enabled |
Activer ou désactiver la bannière de consentement aux cookies globalement. | true |
gdpr_cookie_lifetime |
Combien de jours le cookie de préférence de consentement est mémorisé (1–3650). | 365 |
gdpr_log_consents |
Enregistrer chaque décision de consentement du visiteur dans la base de données pour l’audit de conformité. | true |
gdpr_banner_position |
Où la bannière apparaît sur la page (7 positions disponibles). | bottom-center |
gdpr_privacy_policy_url |
URL vers votre page de politique de confidentialité, affichée comme lien dans la bannière. | (vide) |
gdpr_category_analytics |
Afficher la bascule de la catégorie de cookies Analytiques dans le panneau de préférences. | false |
gdpr_category_marketing |
Afficher la bascule de la catégorie de cookies Marketing dans le panneau de préférences. | false |
gdpr_category_preferences |
Afficher la bascule de la catégorie de cookies Préférences dans le panneau de préférences. | false |
Valeurs par défaut du fichier de configuration
Le fichier config/gdpr.php fournit les valeurs par défaut utilisées lorsqu’aucun paramètre de base de données n’existe :
Admin : Paramètres
La page des paramètres (RGPD → Paramètres) est organisée en trois zones principales :
Paramètres généraux
La colonne de gauche (7/12 de largeur) contient les options de configuration principales :
- Activer la bannière de cookies : interrupteur à bascule pour activer/désactiver la bannière globalement. Lorsqu’il est désactivé, aucune bannière n’est affichée et aucune injection par middleware n’a lieu.
- Durée de vie du cookie (jours) : saisie numérique (1–3650 jours) contrôlant combien de temps le cookie de consentement persiste dans le navigateur du visiteur.
- Position de la bannière : sélecteur visuel de position avec 7 positions affichées sur une maquette de navigateur. Cliquez sur une position pour la sélectionner ; le libellé se met à jour en temps réel.
- Journaliser les actions de consentement : interrupteur pour activer/désactiver la journalisation du consentement dans la base de données. Lorsqu’il est activé, chaque action Accepter/Refuser/Personnaliser/Retirer est enregistrée.
- URL de la politique de confidentialité : champ texte pour l’URL de votre page de politique de confidentialité. Si fourni, un lien « Politique de confidentialité » apparaît dans la bannière.
Sélecteur de position de la bannière
Le sélecteur de position est un élément visuel interactif montrant une fenêtre de navigateur miniature. Sept points cliquables représentent les positions disponibles :
| Position | Disposition | Description |
|---|---|---|
top-left |
Carte compacte | Carte flottante dans le coin supérieur gauche (max 420px de large) |
top-center |
Barre pleine largeur | Barre horizontale en haut de la page |
top-right |
Carte compacte | Carte flottante dans le coin supérieur droit (max 420px de large) |
middle-center |
Boîte de dialogue modale | Modale centrée avec un fond semi-transparent |
bottom-left |
Carte compacte | Carte flottante dans le coin inférieur gauche (max 420px de large) |
bottom-center |
Barre pleine largeur | Barre horizontale en bas de la page (par défaut) |
bottom-right |
Carte compacte | Carte flottante dans le coin inférieur droit (max 420px de large) |
Catégories de cookies
La colonne de droite (5/12 de largeur) affiche les quatre catégories de cookies avec des interrupteurs à bascule :
- Essentiels : toujours actifs, ne peuvent pas être désactivés (affichés avec un badge « Toujours actif »). Ce sont les cookies nécessaires au fonctionnement du site (sessions, jetons CSRF, etc.).
- Analytiques : activable. Lorsqu’il est activé, les visiteurs peuvent accepter/refuser les cookies analytiques (Google Analytics, Hotjar, etc.).
- Marketing : activable. Lorsqu’il est activé, les visiteurs peuvent accepter/refuser les cookies marketing (Facebook Pixel, reciblage publicitaire, etc.).
- Préférences : activable. Lorsqu’il est activé, les visiteurs peuvent accepter/refuser les cookies de préférence (langue, thème, personnalisation, etc.).
Statistiques d’aperçu du consentement
En haut de la page des paramètres, cinq cartes statistiques affichent les métriques de consentement des 30 derniers jours :
- Total des consentements : nombre total d’actions de consentement enregistrées
- Tout accepté : visiteurs qui ont cliqué sur « Tout accepter »
- Tout refusé : visiteurs qui ont cliqué sur « Tout refuser »
- Personnalisé : visiteurs qui ont enregistré des préférences personnalisées
- Taux d’acceptation : pourcentage de « Tout accepté » par rapport au total des consentements
Admin : Journaux de consentement
La page des journaux de consentement (RGPD → Journaux de consentement) fournit une piste d’audit complète de chaque décision de consentement des visiteurs, comme requis par l’article 7 du RGPD.
Statistiques
Quatre mini cartes statistiques en haut de la page :
- Total des consentements (couleur neutre)
- Tout accepté (couleur succès/vert)
- Tout refusé (couleur danger/rouge)
- Taux d’acceptation (couleur accent, affiché en pourcentage)
Table des journaux
Un tableau paginé (25 enregistrements par page) avec les colonnes suivantes :
| Colonne | Description |
|---|---|
| Visiteur | Avatar + nom/e-mail de l’utilisateur (si authentifié) ou libellé « Invité » (si anonyme) |
| Adresse IP | Adresse IP du visiteur, affichée en formatage monospace/code |
| Action | Badge coloré : Tout accepté (vert), Tout refusé (rouge), Personnalisé (jaune), Retiré (gris) |
| Catégories | Badges en ligne pour chaque catégorie montrant l’état activé (plein) ou désactivé (contour) |
| Date | Temps relatif lisible (ex. « il y a 2 heures ») avec la date complète dans une infobulle |
Filtres
- Recherche : filtrer par adresse IP, nom d’utilisateur ou e-mail d’utilisateur
- Action : liste déroulante pour filtrer par type d’action de consentement
(
accepted_all,rejected_all,customized,withdrew)
État vide
Lorsqu’aucun journal n’existe, un état vide convivial est affiché avec une grande icône et un message expliquant que les enregistrements apparaîtront une fois que les visiteurs interagiront avec la bannière.
Front-end : Bannière de cookies
La bannière de consentement aux cookies est un composant HTML/CSS/JS autonome qui est automatiquement injecté
dans chaque page front-end via le middleware InjectCookieBanner.
Vue principale de la bannière
La vue principale affiche :
- Icône de cookie : une illustration SVG en ligne d’un cookie
- Titre : « Préférences de cookies »
- Message : une brève explication de l’utilisation des cookies
- Lien Politique de confidentialité : affiché uniquement si une URL est configurée dans les paramètres
- Trois boutons d’action :
- Tout accepter (bouton primaire sombre) : accepte toutes les catégories de cookies
- Tout refuser (bouton secondaire gris) : refuse tous les cookies non essentiels
- Personnaliser (bouton fantôme/texte) : ouvre le panneau de préférences
Positions de la bannière
La bannière adapte sa disposition en fonction de la position configurée :
- Positions pleine largeur (
top-center,bottom-center) utilisent une disposition flex horizontale avec le contenu et les boutons côte à côte. Largeur maximale 860px, centrée. - Positions en coin (
top-left,top-right,bottom-left,bottom-right) utilisent une disposition de carte compacte (max 420px) avec le contenu empilé. - Position modale (
middle-center) centre la bannière avec un fond semi-transparent, fonctionnant comme une boîte de dialogue modale (max 520px).
Panneau de préférences
Cliquer sur « Personnaliser » fait la transition de la vue principale vers le panneau de préférences (sans rechargement de page). Le panneau affiche :
- Bouton retour avec icône chevron : retourne à la vue principale de la bannière
- Liste des catégories (défilable, hauteur maximale 280px) avec une ligne par catégorie activée :
- Nom et description de la catégorie
- Catégories obligatoires : affichent un badge « Toujours actif » (pas de bascule)
- Catégories optionnelles : affichent un interrupteur à bascule CSS personnalisé
- Enregistrer les préférences : bouton qui enregistre les catégories sélectionnées et ferme la bannière
Animations
La bannière utilise des animations CSS fluides :
- Glissement depuis le bas pour les positions basses
- Glissement depuis le haut pour les positions hautes
- Fondu + mise à l’échelle pour la position modale centrale
- Animations inverses lorsque la bannière est fermée
Design responsive
Sur les écrans en dessous de 768px :
- Les barres pleine largeur passent en disposition verticale (empilée)
- Les cartes en coin s’étendent en pleine largeur
- Les boutons d’action s’empilent verticalement et remplissent la largeur
Traductions
Des fichiers de traduction sont fournis pour l’anglais (en) et le français (fr).
Toutes les chaînes utilisent le préfixe d’espace de noms gdpr::.
Clés de traduction
| Section | Modèle de clé | Description |
|---|---|---|
| Catégories | gdpr::gdpr.categories.* |
Noms et descriptions des catégories (nécessaire, analytiques, marketing, préférences) |
| Actions | gdpr::gdpr.actions.* |
Libellés des actions de consentement (accepted_all, rejected_all, customized, withdrew) |
| Positions | gdpr::gdpr.positions.* |
Libellés des positions de la bannière pour le sélecteur admin |
| Front-end | gdpr::gdpr.front.* |
Chaînes de l’interface de la bannière (titre, message, libellés des boutons, lien de confidentialité) |
| Paramètres admin | gdpr::gdpr.admin.settings.* |
Libellés, indices et en-têtes de section de la page des paramètres |
| Journaux de consentement admin | gdpr::gdpr.admin.consent_logs.* |
Libellés, en-têtes de colonnes et état vide de la page des journaux de consentement |
| Statistiques admin | gdpr::gdpr.admin.stats.* |
Libellés des cartes statistiques (total_consents, accepted_all, etc.) |
| Messages | gdpr::gdpr.admin.messages.* |
Messages flash (settings_updated) |
Mise à jour
Étape 1 : Remplacer les fichiers
Remplacez le répertoire de l’add-on par la nouvelle version.
Étape 2 : Exécuter les migrations
Étape 3 : Vider les caches
Étape 4 : Vérifier
Visitez RGPD → Paramètres dans le panneau d’administration pour confirmer que tous les paramètres sont intacts et que la bannière fonctionne correctement sur le front-end.
Dépannage
La bannière n’apparaît pas sur le front-end
Vérifiez les points suivants :
- L’add-on est activé dans Admin → Add-ons.
- Le paramètre
gdpr_enabledest défini sur1(activé) dans les paramètres. - Vous n’avez pas déjà un cookie
gdpr_consentdéfini. Effacez les cookies ou utilisez une fenêtre incognito pour tester. - La page est une réponse HTML standard avec une balise
</body>(le middleware recherche cette balise pour injecter la bannière). - Vous consultez une page front-end, pas une page admin (les routes admin sont exclues).
La bannière apparaît sur les pages admin
Cela ne devrait pas se produire : le middleware ignore explicitement les routes admin via is_admin_panel_route().
Si cela se produit, vérifiez que :
- La fonction helper
is_admin_panel_route()est définie et fonctionne dans votre installation Larapen. - Votre préfixe de route admin correspond à la valeur configurée dans
config('larapen.core.admin_prefix').
Le cookie de consentement est chiffré / illisible par JavaScript
L’add-on exclut explicitement le cookie gdpr_consent du middleware EncryptCookies de Laravel.
Si le cookie est toujours chiffré :
- Assurez-vous que le
GdprServiceProviderest correctement enregistré (l’add-on est actif). - Vérifiez qu’aucun middleware ou package personnalisé ne re-chiffre le cookie.
- Effacez les cookies de votre navigateur et consentez à nouveau : d’anciens cookies chiffrés d’une configuration précédente peuvent persister.
Les journaux de consentement ne sont pas enregistrés
- Vérifiez que
gdpr_log_consentsest défini sur1(activé) dans les paramètres admin. - Vérifiez que la table
gdpr_consent_logsexiste (exécutezphp artisan migrate). - Consultez les journaux du serveur pour les erreurs de base de données (ex. problèmes de permissions).
La position de la bannière ne change pas
- Après avoir changé la position dans les paramètres admin, assurez-vous d’effacer le cookie
gdpr_consent(ou utilisez une fenêtre incognito) : la bannière n’apparaît que pour les visiteurs sans cookie de consentement. - Videz le cache des vues :
php artisan view:clear.
Les catégories ne s’affichent pas dans le panneau de préférences
Seules les catégories activées dans les paramètres admin apparaissent dans le panneau de préférences. La catégorie « Essentiels » apparaît toujours. Pour les catégories optionnelles :
- Vérifiez que
gdpr_category_analytics,gdpr_category_marketinget/ougdpr_category_preferencessont définis sur1dans les paramètres. - Les catégories désactivées sont filtrées par le middleware
InjectCookieBanneravant le rendu de la vue.
Rétention / purge des journaux
La méthode GdprService::purgeOldLogs() supprime les journaux plus anciens que la période de rétention configurée
(log_retention_days, par défaut : 730 jours / 2 ans). Cette méthode n’est pas actuellement raccordée à une
tâche planifiée. Pour purger les anciens journaux :
- Appelez-la manuellement depuis une commande Artisan ou tinker :
app(GdprService::class)->purgeOldLogs() - Ou ajoutez-la au planificateur de votre application dans
routes/console.php:
Erreur de jeton CSRF sur les points de terminaison de consentement
Tous les points de terminaison de consentement (/gdpr/accept-all, etc.) nécessitent un jeton CSRF valide.
Le JavaScript de la bannière inclut le jeton depuis la vue Blade rendue. Si vous voyez des erreurs 419 :
- Assurez-vous que votre session Laravel est correctement configurée.
- Vérifiez que le groupe middleware
web(qui inclutVerifyCsrfToken) est appliqué aux routes de consentement. - Si vous utilisez une vue de bannière personnalisée, assurez-vous qu’elle transmet le jeton CSRF dans l’en-tête
X-CSRF-TOKENdes requêtes fetch.