Aller au contenu

Créer un compte utilisateur en ligne de commande

Vous êtes administrateur·rice d'une instance Kirexo et vous voulez ajouter un compte (utilisateur, admin ou mixte) sans passer par les fixtures.

L'inscription publique étant fermée dans Kirexo — et l'interface d'admin gérant les comptes mais jamais le contenu (cf. Architecture) — la commande app:user:create est la voie pour provisionner un premier compte admin, puis ajouter des comptes à la main.

Prérequis

  • La stack Docker est démarrée (castor docker:up).
  • Les migrations sont à jour (castor doctrine:migrate).
  • Un terminal interactif (TTY) : le mot de passe est saisi en mode masqué, ce qui exige un vrai terminal. Une invocation non interactive (pipe, job CI sans pseudo-TTY) ne pourra pas lire le mot de passe.

Invocation

La commande n'a pas de cible Castor dédiée : elle passe par la cible générique castor console, qui exécute bin/console dans le conteneur php.

La signature complète est :

bin/console app:user:create <email> <firstName> [--role=user|admin|both]

Le prénom (firstName) est un argument obligatoire, placé après l'email. Il sert aussi à nommer le carnet par défaut créé en même temps que le compte (voir Carnet par défaut).

Depuis l'hôte

castor console "app:user:create alice@kirexo.local Alice --role=admin"

Depuis le conteneur php

Si vous avez déjà un shell dans le conteneur (castor docker:sh) :

bin/console app:user:create alice@kirexo.local Alice --role=admin

La commande demande ensuite le mot de passe en mode masqué :

 Mot de passe:
 >

Le mot de passe n'est jamais passé en argument — il resterait sinon dans l'historique du shell. Il est lu en clair-masqué sur le TTY et refusé s'il est vide.

Arguments et option

Élément Obligatoire Défaut Description
email (argument) oui Email du compte. Validé : non vide et format email correct.
firstName (argument) oui Prénom du titulaire. Non vide. Placé après l'email. Nomme le carnet par défaut créé avec le compte.
--role (option) non user Rôle du compte : user, admin ou both.

Carnet par défaut

À la création, la commande crée le compte et son premier carnet dans la même unité de travail. Le carnet reçoit un nom dérivé du prénom : « Le carnet de \<prénom> ». Par exemple, app:user:create alice@kirexo.local Alice crée un compte doté d'un carnet nommé « Le carnet de Alice ».

Ce nom n'est qu'un défaut : il reste librement modifiable ensuite par l'utilisateur, qui peut aussi créer d'autres carnets. Tout compte possède ainsi au moins un carnet dès sa création. Sur le modèle de données multi-carnets, voir Carnets : modèle de données et migration mono → multi-carnets.

Correspondance --role → rôles stockés

--role Rôles attribués
user ROLE_USER
admin ROLE_ADMIN
both ROLE_USER, ROLE_ADMIN

Exemples

Créer un compte utilisateur standard (rôle par défaut) :

castor console "app:user:create bob@kirexo.local Bob"

Créer un compte administrateur :

castor console "app:user:create admin@kirexo.local Camille --role=admin"

Créer un compte cumulant les deux rôles :

castor console "app:user:create carlos@kirexo.local Carlos --role=both"

En cas de succès, la commande affiche un message confirmant l'email, les rôles attribués et l'identifiant du compte créé, et se termine avec le code de sortie 0.

Cas d'erreur

La commande s'arrête avec le code de sortie 1 et un message explicite dans les situations suivantes :

Situation Message
--role hors user / admin / both Rôle invalide, avec la liste des valeurs acceptées.
Email vide L'email ne peut pas être vide.
Prénom vide Le prénom ne peut pas être vide.
Email mal formé Email invalide, avec la raison renvoyée par le validateur.
Email déjà utilisé Un compte existe déjà avec cet email.
Mot de passe vide Le mot de passe ne peut pas être vide.

Aucun compte n'est créé tant qu'une de ces conditions échoue.

Sous le capot

La commande est implémentée dans src/Command/AppUserCreateCommand.php. Elle :

  • valide l'email avec la contrainte Symfony\Component\Validator\Constraints\Email ;
  • vérifie l'unicité via UserRepositoryInterface::findByEmail() (src/Repository/UserRepositoryInterface.php) ;
  • hache le mot de passe avec UserPasswordHasherInterface ;
  • persiste le compte via UserRepositoryInterface::save() (sans flush immédiat) ;
  • construit un Notebook dont le nom est dérivé du prénom via Notebook::defaultName() (src/Entity/Notebook.php), puis le persiste via NotebookRepositoryInterface::save() (src/Repository/NotebookRepositoryInterface.php) — l'INSERT du compte précède celui du carnet, dont le propriétaire est non nul.

Voir aussi

  • Commandes Castor — dont la cible générique castor console.
  • Architecture — pourquoi l'admin gère les comptes mais pas la publication.