Simplifiez votre système d’authentification grâce à Guard

Simplifiez votre système d’authentification grâce à Guard

Symfony dispose d’un système de sécurité puissant mais compliqué

La sécurisation d’une application Symfony est gérée à deux niveaux : l’authentification et l’autorisation. Ce système est assez puissant, performant et flexible. Cependant, il est complexe et difficile à personnaliser, notamment au niveau de l’authentification : Les développeurs y trouvent des difficultés en particulier au niveau la gestion de l’ensemble du processus sur plusieurs classes. Exemple : la création d’un formulaire est facile, mais la personnalisation du chargement de l’utilisateur ou bien le comportement en cas d’échec d’authentification reste une partie délicate. On déduit alors que pour un besoin d’authentification simple, les composants natifs de Symfony proposent déjà un système assez complexe. Ceci pose un labeur plus important pour les applications modernes qui combinent souvent des systèmes d’authentification multiples (session, apikey, token d’authentification, etc). Parfaitement consciente de cette problématique, la communauté a travaillé sur des alternatives plus efficaces et propose le bundle « Guard ».

BANNIERE_ARTICLE_v08122017
Guard : Le système d’authentification simple et robuste

Un nouveau composant a été intégré à Symfony en septembre 2015, il a été déjà développé par KnpUniversity. Il s’agit du composant Guard intégré au module de sécurité de la version 2.8. Il vient résoudre le problème majeur du système d’authentification natif en centralisant et standardisant la gestion de tout le processus dans une seule classe PHP appelée «Authenticator». Cette classe implémente l’interface GuardAuthenticatorInterface contenant uniquement 7 méthodes à implémenter:

  • getCredentials: Permet d’extraire les identifiants de la requête.
  • getUser: Permet de récupérer un utilisateur en fonction de ses identifiants.
  • checkCredentials: Permet de vérifier les identifiants.
  • createAuthenticationToken: Permet de créer le token d’authentification.
  • onAuthenticationFailure: Retourne un objet Response dans le cas où l’authentification échoue.
  • onAuthenticationSuccess: Retourne un objet Response dans le cas où l’authentification réussit.
  • supportsRememberMe: Permet de spécifier si la stratégie d’authentification supporte la fonctionnalité « Se souvenir de moi ».

Ensuite il suffit simplement d’enregistrer cette classe en tant que service afin de bénéficier des avantages du nouveau système d’authentification :

  • Maintenable: Le code centralisé et standardisé devient facile à maintenir et à faire évoluer.
  • Moderne: Les applications modernes offrent souvent plusieurs modes d’authentification différents en fonction de leur contexte d’usage : front end WEB, application mobile, application tierce, etc. Guard permet d’implémenter un système de sécurité hétérogène faisant cohabiter plusieurs modes d’authentification (session, apikey, token d’authentification, etc.) répondant ainsi parfaitement aux nouvelles exigences applicatives.
  • Personnalisable: Guard a apporté une nouvelle classe CustomAuthenticationException qui permet la personnalisation dynamique de n’importe quel message d’erreur (ou de confirmation). Tandis que Symfony avec son système de sécurité natif propose des moyens beaucoup moins pratiques pour y arriver.
  • Rétrocompatible: Le composant Guard est compatible avec la majorité des versions antérieures à Symfony 2.8. Il pourra donc être intégré sur des anciennes implémentations moyennant des changements maîtrisables.
Le système d’authentification de Coopérons !

L’application Coopérons! est basée sur le système FOSUser et proposait un unique moyen d’authentification : login/mot de passe. On a eu besoin d’élargir le périmètre d’usage de l’application en offrant deux modes supplémentaires :

  • Un front end Angular communicant avec l’application métier.
  • Usage en mode API permettant à d’autres applications tierce de pouvoir s’y intégrer.

Afin de répondre aux nouvelles exigences applicatives, trois systèmes d’authentification différents s’imposent :

  • Authentification par login/mot de passe : pour le dashboard de l’API.
  • Authentification OAuth2 (client credentialsgrant / front end Angular) pour les utilisateurs front de l’application Coopérons !
  • Authentification par ApiKey pour des applications clients utilisant l’API Coopérons !

Grâce à Guard nous avons réussi d’abord à migrer le système existant et ensuite à mettre en œuvre ce système sophistiqué en un temps record sans compromettre l’efficacité du système existant basé sur les composants natifs.

BANNIERE_ARTICLE_v08122017

One Comment

  1. BILEL NOOMENE
    Déc 27, 2016 @ 21:56

    Très intéressant. Avec ce composant, la mise en place d’un système d’authentification dans un projet Symfony devient triviale. LexikJwtAuthenticationBundle par exemple propose une classe Authenticator déjà implémentée. Rien à faire qu’à configurer un service qui hérite de celle-ci.

    Répondre

Laisser un commentaire