Bonjour,

Je me retouve face à une réflexion suite à une procedure d'inscription d'un membre non conventionnel.

Ce que je fais

Je finalise la partie administrative du site institutionnel de mon entreprise sous Symfony 5 et je serai certainement le seul utilisateur à l'administrer (newsletter, formulaire de contact, statistiques, bref du classique)

Comme il n'y aura pas de page "register", j'ai prévu la création d'un nouvel utilisateur via ma page d'administration.

J'ai crée une toute petite fonction qui attribue un mot de passe aléatoire :

class RandomPassword
{

    /**
     *
     * @param [type] $lenght
     * @return void
     */
    public function random_password($length)
    {
        $alphabet = "0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN";
        return substr(str_shuffle(str_repeat($alphabet, $length)), 0, $length);
    }
}

Ce qui donne ceci :

Par la suite, la personne reçoit un mail avec son mot de passe et lui demande de la changer via sa page de profile.

Le controller :

/**
 * @Route("/new", name="user_new", methods={"GET","POST"})
 */
public function new(Request $request, RandomPassword $random, UserPasswordEncoderInterface $passwordEncoder, EmailVerifier $emailVerifier): Response
{
    $title = "Créer un nouvel admnistrateur";

    $user = new User();
    $new_password = $random->random_password(10);

    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $temp_password = $form->get('password')->getData();

        $user->setPassword(
            $passwordEncoder->encodePassword(
                $user,
                $form->get('password')->getData()
            )
        );

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();

        // generate a signed url and email it to the user
        $emailVerifier->sendEmailConfirmation(
            'app_verify_email',
            $user,
            (new TemplatedEmail())
                ->from(new Address('contact@com4munity.com', 'Com4Munity, Votre inscription'))
                ->to($user->getEmail())
                ->subject('Veuillez confirmer votre email')
                ->htmlTemplate('email/inscription_email.html.twig')
                // pass variables (name => value) to the template
                ->context([
                    "firstname" => $user->getFirstname(),
                    "lastname" => $user->getLastname(),
                    "password" =>  $temp_password
                ])
        );

        return $this->redirectToRoute('user_index');
    }

    return $this->render('user/new.html.twig', [
        'user' => $user,
        'temp_password' => $new_password,
        'form' => $form->createView(),
        'title' => $title,
    ]);
}

Ce que je veux

Au final cette méthode ne me satisfait pas vraiment au niveau des bonnes pratiques et je songe plutôt à envoyer un lien par mail pour que la personne puisque s'inscrire.

Qu'en pensez vous ?

2 réponses


Salut, selon moi tu peux tout simplement,
Utiliser un formulaire avec un inscription classique, et lors de l'inscription dans ta base de donné, le champ "token" de ta table est complété avec un clé.
Cette clé est envoyé par mail à travers un lien et au clique de celui-ci cela modifie ta base de donné et rend le champ "token" null

Donc si il tente de se connecter et que le token est null alors il se connecte. Sinon valider votre compte.

Voilà comment j'ai fais pour quelque projet. C'est peut-être plus simple que de s'inscrire après le mail. à toi de voir. ^^

Hello.

Justement je vais faire un mix des deux et envoyer un lien d'inscription temporaire , qui fera que même si on utlise la page d'enregistrement on ne pourra pas s'inscrire.
Autre possibilité, j'inscris directement un nouvel admin et je lui file le mot de passe directement.
Pour l'instant je me tate.

Merci pour la réponse.