Adrien Gras
Ateliers

Utilisateurs et sécurité

Entité User, formulaires de connexion et d'inscription, contrôle d'accès et utilisateur connecté en Twig.

Durant cet atelier, nous allons configurer la gestion des utilisateurs et la sécurité dans notre application Symfony.

À savoir

La plupart de l'atelier sera fait en live-coding. Pensez à bien prendre des notes pour vous y référer plus tard !

Prérequis

Avant de pouvoir traiter les aspects de sécurité, nous allons devoir installer les composants nécessaires pour intégrer une base de donnée à notre application.

Astuce

Nous n'allons pour l'instant qu'installer les composants, nous verrons l'aspect base de donnée dans un futur atelier ; mais les utilisateurs étant stockés en base de données, il est important de préparer cette étape.

Consigne

  1. Ouvrez le fichier composer.json, et, dans la section config, modifiez la pour correspondre à ceci :
    "config": {
        "allow-plugins": {
            "php-http/discovery": true,
            "symfony/flex": true,
            "symfony/runtime": true
        },
        "bump-after-update": true,
        "sort-packages": true,
        "platform": {
            "php": "8.3.28"
        }
    },
  1. Installez l'ORM Pack dans votre projet. Documentation : https://symfony.com/doc/current/doctrine.html
  2. Regardez vos fichiers docker-compose.yml et .env et observez ce qu'il s'est passé lors de l'installation du pack.
  3. Dans le fichier .env, changez la variable DATABASE_URL pour modifier le host en database (le nom du service dans Docker).
  4. Redémarrez vos conteneurs Docker pour appliquer les changements : docker compose down && docker compose up -d.

Configuration de la sécurité

Création du formulaire de login/logout

Consigne

  1. Installez le pack de sécurité Symfony. Documentation : https://symfony.com/doc/current/security.html
  2. Utilisez la commande symfony console make:user pour créer une entité User avec comme champ identifiant l'email.
  3. Synchronisez la base de donnée avec vos entity en utilisant la commande symfony console doctrine:schema:update --force --dump-sql.
  4. Utilisez la commande symfony console make:security:form-login pour générer un système de login/logout.

Vous pouvez maintenant customisez la page de login générée pour qu'elle corresponde au design de votre application.

Création du formulaire d'inscription

Consigne

  1. Utilisez la commande symfony console make:registration-form pour générer un système d'inscription, sans envoi d'email, et qui redirige vers la page de login après inscription.

Vous pouvez maintenant customisez la page d'inscription générée pour qu'elle corresponde au design de votre application.

Consigne

  1. Testez l'inscription, le login et le logout de votre application.

Astuce

Vous remarquerez sans doute que le login vous redirige vers la page d'accueil après connexion.

Vous pouvez modifier ce comportement en modifiant le fichier security.yaml, dans la section firewalls > main > form_login, vous pouvez ajouter la clé default_target_path avec comme valeur la route vers laquelle vous souhaitez rediriger l'utilisateur après connexion (exemple : default_target_path: app_wallets_list).

Astuce

Vous devrez sans doute modifier votre menu pour que le bouton de déconnexion mène bien à la route de déconnexion.

Protection des routes

Consigne

  1. Modifiez le fichier security.yaml pour protéger les routes via le bloc de configuration access_control comme suit :
    • La route / doit être accessible à tous. (rôle PUBLIC_ACCESS)
    • Les routes /login et /register doivent être accessibles à tous. (rôle PUBLIC_ACCESS)
    • Toutes les autres routes doivent être accessibles uniquement aux utilisateurs authentifiés. (rôle IS_AUTHENTICATED_FULLY)

Astuce

Vous pouvez vous reporter aux instructions dans le fichier security.yaml où à la documentation https://symfony.com/doc/7.4/security.html#access-control-authorization.

Récupération de l'utilisateur connecté

Consigne

  1. Dans le menu de navigation, affichez l'email de l'utilisateur connecté. Vous pouvez utiliser la variable globale app de Twig pour accéder à l'utilisateur courant via app.user. Documentation : https://symfony.com/doc/current/templates.html#the-app-global-variable

Sur cette page