Bonjour,
Je suis entrain d'inscrire mes utilisateurs (confimation de compte avec email)et les authetifiés sans utilisé FOSUserBundle
je suis inspiré par ce vidéo(recommandé par un membre de ce groupe) : https://www.grafikart.fr/tutoriels/confirmation-compte-824
qu'est ce que j'ai fais:
1-enregistrement des utilisateur
2-l'email est envoyé à l'utilisateur pour activation
3-si l'utilisateur clique sur le lien activate les champs : confirmation_token=null and enabled =true seront mis à jour
Mais
Je ne sais pas comment tester dans la fonction login pour ajouter la condition confirmationToken = null et enabled =true , pour que les compte activés ont le droit de se connecter
security.yml
encoders:
AppBundle\Entity\User: bcrypt
providers:
db_provider:
entity:
class: AppBundle\Entity\User
property: username
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
provider: db_provider
form_login:
login_path: login
check_path: login
logout:
path: /logout
target: /
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
registrationController:
/**
* @Route("/register")
* @param Request $request
* @Template()
* @return \Symfony\Component\HttpFoundation\Response
*/
public function registerAction(Request $request)
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
$em = $this->getDoctrine()->getManager();
if ($form->isSubmitted() && $form->isValid()) {
$password = $this->get('security.password_encoder')
->encodePassword($user, $user->getPlainPassword());
$user->setPassword($password);
$em->persist($user);
$em->flush();
$confirmationToken = $user->getConfirmationToken();
$username = $user->getUsername();
$userId = $user->getId();
$subject = 'Account activation';
$email = $user->getEmail();
/* $renderedTemplate = $this->render('AppBundle:Register:registrationConfirmed.html.twig', array(
'username' => $username,
'confirmationToken' => $confirmationToken
));*/
$message = (new \Swift_Message('Hello Email'))
->setSubject($subject)
->setFrom($this->container->getParameter('mailer_user'))
->setTo($email)
->setBody(
$this->renderView(
'AppBundle:Register:registrationConfirmed.html.twig', array('id' => $userId,'username' => $username,'confirmationToken' => $confirmationToken)), 'text/html');
$this->get('mailer')->send($message);
$this->addFlash('success', 'Genus created!');
return $this->redirectToRoute('login');
}
return $this->render('AppBundle:Register:register.html.twig', array('form' => $form->createView()));
}
/**
* @Route("/confirm/{id}/{confirmationToken}", name="confirmation_path")
*/
public function confirmAction(Request $request, $id,$confirmationToken)
{
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository('AppBundle:User');
//$confirmationToken = $user->getConfirmationToken();
$user = $repository->findUserByIdAndConfirmationToken($id,$confirmationToken);
if (!$user)
{
throw $this->createNotFoundException('We couldn\'t find an account for that confirmation token');
}
else
{
$user= $repository->updateConfirmationTokenAfterValidation($id,$confirmationToken);
// $user->setEnabled(true);
// $user->setConfirmationToken(null);
//$em->persist($user);
// $em->flush();
}
return $this->redirectToRoute('login');
}
ce lien se trouuve dans l'email envoyé pour activer le compte:
<a href="{{ url('confirmation_path', {'id': id, 'confirmationToken': confirmationToken } ) }}">Activate</a>
pour la connexion c'est loginAction qui fait le travail, donc Comment tester confirmToken=null pour que juste les compte activé ont le droit se connecter
/**
* @Route("/login",name="login")
*/
public function loginAction()
{
$helper = $this->get('security.authentication_utils');
return $this->render('AppBundle:Login:login.html.twig', [
// last username entered by the user (if any)
'last_username' => $helper->getLastUsername(),
// last authentication error (if any)
'error' => $helper->getLastAuthenticationError(),
]);
}
my login.html.twig
<form action="{{ path('login') }}" method="post">
<div class="form-group">
<label for="username">{{ 'label.username'|trans }}</label>
<input type="text" id="username" name="_username" class="form-control"/>
</div>
<div class="form-group">
<label for="password">{{ 'label.password'|trans }}</label>
<input type="password" id="password" name="_password" class="form-control" />
</div>
<button type="submit" class="btn btn-primary">
<i class="fa fa-sign-in" aria-hidden="true"></i> {{ 'action.sign_in'|trans }}
</button>
</form>