User Tools

Site Tools


backend:symfonysecurity

Symfony : Security

logo

Présentation

Le bundle Security intègre le composant Sécurity dans Symfony. Ce composant est composé de plusieurs autres sous-composants qui peuvent être utilisés séparément :

  • symfony/security-core : fournit toutes les fonctionnalités de sécurité courantes, de l'authentification à l'autorisation et du codage des mots de passe au chargement des utilisateurs.
  • symfony/security-http : intègre le sous-composant principal avec le protocole HTTP pour gérer les requêtes et réponses HTTP.
  • symfony/security-csrf : offre une protection contre les attaques CSRF.
  • symfony/security-guard : rassemble de nombreuses couches d'authentification, permettant la création de systèmes d'authentification complexes.

La sécurité courante se décompose en 3 parties :

  • Encoders
    • Comment encoder les données :
      • Hash
      • Algorithme
      • Encodeurs différents suivant les entités
  • Providers
    • Ou sont les données des utilisateurs (bases de données, annuaires LDAP, fichiers, …)
    • Comment on va reconnaître les utilisateurs
  • Firewalls
    • Ils définissent les parties de l'application qu'on veut protéger
    • Comment on va protéger ces différentes parties

Toutes ces informations sont définies dans le fichier config\packages\security.yaml.

Installation

Pour l'installer, il faut utiliser :

composer require symfony/security-bundle

Encoders

Configuration

Ils servent a définir les méthodes de cryptage (hachage) des mots de passse, ils sont configurés dans le fichier config\packages\security.yaml

    encoders:
        App\Entity\User:
          algorithm: bcrypt

- App\Entity\User est le nom de l'encoder, on peut mettre le nom qu'on veut.
- algorithm: bcrypt défini le type d'algorithme qu'on souhaite utiliser.

En mettant algorithm: auto, Symfony prendra toujours le meilleur algorithme en date.

On peut utiliser plusieurs encoders.
Lorsqu'il n'y a que l'algorithme de défini, sans le cost, on peut écrire :

    encoders:
        App\Entity\User: bcrypt

security:encode-password

Lorsqu'un encoder a été défini, on peut utiliser la commande security:encode-password dans la console, elle permet d'encoder un mot de passe :

symfony console security:encode-password

Précisions

Hachage

Il existe plusieurs algorithmes pour hacher les mots de passe (MD5, Bcrypt, Sodium (Argon2d, Argon2i, Argon2id)…).

MD5 est déprécié pour le hachage de mot de passe.

Salt

Le salage, est une méthode permettant de renforcer la sécurité des informations qui sont destinées à être hachées (par exemple des mots de passe) en y ajoutant une donnée supplémentaire afin d'empêcher que deux informations identiques conduisent à la même empreinte

Symfony gère le salt automatiquement, ce n'est pas la peine de gérer la fonction getSalt() dans l'entité User.

Cost

C'est une valeur comprise entre 4 et 31, elle défini la complexité du cryptage. Plus la valeur est élévée, plus le cryptage est sécurisé et plus l'algorithme demande de ressource pour fonctionner.

    encoders:
        App\Entity\User:
          algorithm: bcrypt
          cost: 13

Par défaut la valeur est de 13, si on n'indique rien, c'est cette valeur qui est utilisée.

Providers

Les providers permettent de recharger automatiquement, depuis la session, l'utilisateur connecté.

    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email

Ici, c'est l'email qui est rechargé depuis la session pour l'entité User.

Il faut indiquer le provider utilisé dans les firewalls, ici app_user_provider.

User impersonation

Documentation officielle : How to Impersonate a User

User impersonation n'est pas compatible avec certains mécanismes d'authentification (par exemple REMOTE_USER) où les informations d'authentification devraient être envoyées à chaque demande.

Parfois, il est utile de pouvoir passer d’un utilisateur à un autre sans avoir à se déconnecter puis à se reconnecter (par exemple, lorsque vous déboguez quelque chose qu’un utilisateur voit que vous ne pouvez pas reproduire). Il faut activer switch_user dans le firewall pour pouvoir l'utiliser :

# config/packages/security.yaml
security:
    # ...
    firewalls:
        main:
            # ...
            switch_user: true

Pour passer à un autre utilisateur, il faut ajouter une chaîne de requête avec le paramètre _switch_user et le nom d'utilisateur (ou tout autre champ que le fournisseur d'utilisateurs utilise pour charger les utilisateurs) comme valeur de l'URL actuelle :

http://example.com/somewhere?_switch_user=thomas

Pour revenir à l'utilisateur d'origine, il faut utilisez le nom d'utilisateur spécial _exit :

http://example.com/somewhere?_switch_user=_exit

Cette fonctionnalité n'est disponible que pour les utilisateurs disposant d'un rôle spécial appelé ROLE_ALLOWED_TO_SWITCH.

Firewalls

Les firewalls gèrent la partie authentification d'une application. On peut en définir plusieurs :

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        anonymous: true
        lazy: true
        provider: app_user_provider
        guard:
            authenticators:
                - App\Security\LoginFormAuthenticator
        logout:
            path: app_logout
            target: app_home
        remember_me:
            secret: '%kernel.secret%'
            lifetime: 604800 # 1 week in seconds
            path: /

anonymous

Permet d'activer ou non l'authentification anonyme des utilisateurs, lorsqu'il est activé, les utilisateurs sont connectés anonymement avant de réellement se connecter (ou pas).

form_login

login_path

check_path

authenticators

Cela indique le moyen d'authentification des utilisateurs.
Ici, on utilise le formulaire LoginFormAuthenticator qui a été crée à la création de Auth' :
The class name of the authenticator to create (e.g. AppCustomAuthenticator):
> LoginFormAuthenticator

guard

authenticators

lazy

lazy: true est un moyen de gagner en performances, l'utilisateur connecter sera chargé depuis la session uniquement quand l'application va tenter d'accéder à l'utilisateur.

logout

path

Défini la route pour la déconnexion, Symfony gère automatiquement la déconnexion quand cette route est renseignée.

target

Défini la route où rediriger l'utilisateur après la déconnexion

pattern

Cela correspond à un modèle d'ulrs sur lesquelles on applique le firewall.
Ici toutes les urls commençant par _profiler, _wdt, css, image ou js sont concernées par le firewall dev. Cela correspond aux accès nécessaires pour la barre de débogage de Symfony et ax fichiers statiques css, images ou js en développement.

provider

remember_me

Permet de gérer un cookie pour que l'utilisateur reste connecté.
Voir la documentation officielle.

secret

C'est la valeur utilisée pour crypter le contenu du cookie. Il est courant d'utiliser la valeur secrète définie dans la variable d'environnement APP_SECRET.

Le paramètre secret est obligatoire.

lifetime

Correspond au nombre de secondes pendant lesquelles l'utilisateur restera connecté. Par défaut, les utilisateurs sont connectés pendant un an.

path

Le chemin où le cookie associé à cette fonctionnalité est utilisé. Par défaut, le cookie sera appliqué à l'ensemble du site Web, mais on peut limiter à une section spécifique (par exemple /forum, /admin).

security

security: false permet de désactiver la sécurité.

Roles

- Lior Chamla : SYMFONY 4/4 : 1H POUR COMPRENDRE L'AUTHENTIFICATION !, voir les notes prises sur cette vidéo.

- LES TEACHER DU NET : Créer un clone de Pinterest avec Symfony 5 (Épisode 6/10), voir les notes prises sur cette vidéo.

backend/symfonysecurity.txt · Last modified: 2020/09/18 11:38 (external edit)