Comment avoir une liste d'utilisateurs, configurée dans un fichier, non versionné et potentiellement différent d'un environnement à l'autre
Lorsqu'il est question de faire une application sécurisée, se pose toujours la question : "comment sont stockés mes utilisateurs ?".
Contexte
Le composant symfony/security propose plusieurs solutions pour parvenir à vos fins.
Souvent, les utilisateurs sont en base de données, accessibles via doctrine/orm : c'est pratique, flexible, pas trop compliqué et entièrement intégré. En revanche il vous faut une base de données.
Il existe également la possibilité de définir les utilisateurs directement dans la configuration. Ça peut être très pratique pour un projet où créer un nouvel utilisateur n'est pas une tâche courante. Mais alors les utilisateurs sont identiques pour chaque environnement et versionnés.
Cependant, il est possible de s'affranchir de ces 2 contraintes en quelques lignes de configuration.
Prérequis
Vous aurez besoin d'un symfony >= 4.3, car nous allons utiliser les Env Var Processors.
Mise en place
Tout d'abord, nous allons créer notre propre définition du InMemoryUserProvider, car celui qui est fabriqué par la méthode standard ne supporte malheureusement pas les variables d'environnement :
# config/services.yaml parameters: env(USERS_FILE): '%kernel.project_dir%/config/users.json' services: app.config_user_provider: class: Symfony\Component\Security\Core\User\InMemoryUserProvider arguments: $users: '%env(json:file:resolve:USERS_FILE)%'
C'est une définition de service classique, la seule spécificité c'est cette variable d'environnement et les transformations successives qu'on lui applique %env(json:file:resolve:USERS_FILE)%.
Il faut simplement lire de droite à gauche pour comprendre ce qu'il se passe :
USERS_FILEest le nom de la variable d'environnement que l'on va utiliserresolveva remplacer les paramètres dans la valeur de la variablefileva considérer le chemin interprété et faire unfile_get_contentsjsonva transformer le contenu du fichier en json viajson_decode
Ensuite, nous allons déclarer notre user provider dans la sécurité symfony :
# config/packages/security.yaml security: providers: config_user_provider: id: app.config_user_provider
Il ne reste plus qu'à initialiser notre fichier qui va contenir nos utilisateurs :
# config/users.json { "john_admin": { "password": "$2y$13$jxGxc ... IuqDju", "roles": [ "ROLE_ADMIN" ] }, "jane_admin": { "password": "$2y$13$PFi1I ... rGwXCZ", "roles": [ "ROLE_ADMIN", "ROLE_SUPER_ADMIN" ] } }
Et pour finir, pensez à ignorer ce fichier des fichiers versionnés, il suffira d'avoir la bonne version sur votre serveur d'exécution :
# .gitignore /config/users.json
Voilà ! symfony/thanks