Accueil /  Blog / Symfony / Utilisateurs configurés dans un fichier

Utilisateurs configurés dans un fichier

Publié le mercredi 17 juin 2020

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_FILE est le nom de la variable d'environnement que l'on va utiliser
  • resolve va remplacer les paramètres dans la valeur de la variable
  • file va considérer le chemin interprété et faire un file_get_contents
  • json va transformer le contenu du fichier en json via json_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

Suivez notre actualité en avant première. Pas plus d’une newsletter par mois.