Aller au contenu principal

Utilisateurs

Dans beaucoup d'applications, on a besoin d'authentifier des utilisateurs. Symfony fournit pour cela un composant security qui va permettre de gérer l'authentification mais également les autorisations (ou contrôles d'accès).

Pour introduire une entité utilisateur dans l'application, on pourrait utiliser le Maker avec la commande php bin/console make:entity. Cependant, Symfony nous fournit la commande php bin/console make:user pour créer une entité utilisateur compatible avec le composant de sécurité de Symfony.

Cette commande posera tout un tas de questions relatives à la manière dont nous souhaitons intégrer des utilisateurs dans notre application. Une fois créée, l'entité est effectivement différente d'une entité classique : elle implémente 2 interfaces UserInterface et PasswordAuthenticatedUserInterface.

Ces interfaces définissent donc un contrat d'implémentation, qui a été fixé par les développeurs qui ont réalisé le composant de sécurité.

Elles forcent donc l'entité utilisateur à implémenter des méthodes particulières, qui seront ensuite consommées par le composant de sécurité.

On trouvera par exemple des méthodes comme getRoles() ou getPassword().

Les rôles

Symfony gère les rôles d'un utilisateur dans un tableau (array). En base de données, cela se représentera sous forme d'un champ json

Si on souhaite ajouter des champs supplémentaires dans notre utilisateur, on peut tout à fait réutiliser la commande make:entity après avoir exécuté make:user. La commande make:user ne fait que créer un utilisateur "de base", compatible avec le composant de sécurité. Mais cet utilisateur est bien une entité. On aura donc tout le loisir d'y ajouter des attributs supplémentaires, propres à notre application.

Enfin, comme nous l'avons déjà fait auparavant lors de la création d'une entité, on devra créer une migration puis l'exécuter.

Comme lorsque nous créons une entité classique, la création d'une entité utilisateur, nommée User dans notre cas, déclenche la création automatique d'une classe UserRepository.

Par ailleurs, dans le fichier de configuration du composant de sécurité, situé dans config/packages/security.yaml, la commande make:user a automatiquement ajouté les lignes suivantes :

security:
# ...

providers:
app_user_provider:
entity:
class: App\Entity\User
property: email # <-- si nous avons choisi "email" comme nom de champ d'identification lors de l'exécution de la commande "make:user"

C'est l'autre intérêt de la commande make:user. Elle enregistre directement auprès du composant de sécurité un fournisseur d'utilisateurs.

Ce fournisseur sera donc capable de trouver des utilisateurs, mais également, une fois authentifié, de récupérer un utilisateur depuis la session et le rafraîchir.

Enfin, on aura également un password_hasher d'enregistré dans la configuration du composant de sécurité :

security:
# ...
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: "auto"
Hachage du mot de passe

La valeur "auto" permet de sélectionner le meilleur algorithme du moment. Par exemple en version 6.4 cela va sélectionner bcrypt automatiquement