À l'heure actuelle, notre site n'est qu'informatif. Avec des utilisateurs, on pourra amener un peu d'interaction, ce qui fait nécessairement intervenir des sujets de sécurité comme la connexion, les mots de passe, les droits d'accès à certaines pages.
Installons le SecurityBundle
Utilisateurs
Nos utilisateurs seront stockés en base de données, il leur faut donc une entité dédiée. Cependant nous n'allons pas utiliser la commande make:entity
car les utilisateurs doivent posséder certaines propriétés bien définies. On exécute plutôt make:user
pour une classe User
stockée en base de données:
Il faut ensuite indiquer une propriété qui devra être unique pour chaque utilisateur et servira à l'identifier. On gardera la propriété email
:
Pour finir, indiquer que nous nous chargerons des mots de passe:
Avant de générer une migration, modifier l'entité pour ajouter un pseudo:
Le pseudo doit être unique, comme l'email, car il servira à la connexion. Ouvrir le fichier de l'entité et ajouter un argument unique
à l'attribut Column
:
Enfin, mettre à jour la base de données:
Fixtures
Créer le fichier de fixtures des utilisateurs: /fixtures/user.yaml. Pour faciliter la connexion, les emails prendront tous la forme user<X>@mail.org
, ce qui les rendra uniques. Pour que les pseudos soient uniques, on ajoute (unique)
après la clé pseudo
pour utiliser le mode d'unicité de Faker:
La syntaxe
{1..100}
permet une itération de 1 à 100. La fonction<current()>
permet de récupérer ce nombre.
Note: on doit échapper le@
car il sert habituellement à référencer d'autres fixtures.
Un problème se pose pour le mot de passe des utilisateurs. En base de données il doit être hashé, et avec Symfony, on passe par un service pour hasher les mots de passe. Faker ne fournissant évidemment pas de fonction pour satisfaire ce besoin, nous allons suivre la documentation du bundle et créer une classe App\Fixtures\HashedPasswordProvider
:
En héritant de Faker\Provider\Base
, la classe sera automatiquement prise en compte grâce à l'autoconfiguration qui enregistrera le service avec un tag utilisé par le bundle.
On injecte le service pour hasher les mots de passe:
Puis on rajoute notre méthode qui deviendra utilisable dans les fixtures:
On complète les fixtures en définissant le même mot de passe pour tous les utilisateurs afin de simplifier la connexion en environnement de développement: P@ssw0rd
.
Et on recharge les données: