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 ?".
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.
Vous aurez besoin d'un symfony >= 4.3
, car nous allons utiliser les Env Var Processors.
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 utiliserresolve
va remplacer les paramètres dans la valeur de la variablefile
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