vendor\project-biz\portal-bundle\src\Controller\LoginController.php line 73

Open in your IDE?
  1. <?php
  2. namespace ProjectBiz\PortalBundle\Controller;
  3. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  4. use Doctrine\ORM\EntityManager;
  5. use ProjectBiz\FormBundle\Form\Type\CustomPasswordType;
  6. use ProjectBiz\FormBundle\Form\Type\PasswordRecoveryType;
  7. use ProjectBiz\FormBundle\Form\Type\UserCredentialsType;
  8. use ProjectBiz\FormBundle\Form\Type\UserRegistrationType;
  9. use ProjectBiz\FormBundle\Form\Type\UserValidationType;
  10. use ProjectBiz\PortalBundle\Event\UserInteractionEvent;
  11. use ProjectBiz\PortalBundle\Exceptions\DuplicateUsernameException;
  12. use ProjectBiz\PortalBundle\Exceptions\UserNotCreatedException;
  13. use ProjectBiz\PortalBundle\Exceptions\ValidationTokenExpiredException;
  14. use ProjectBiz\PortalBundle\Exceptions\ValidationTokenInvalidException;
  15. use ProjectBiz\UserBundle\Entity\BaseUserInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  21. use Symfony\Component\Security\Core\Security;
  22. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  23. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  24. class LoginController extends AbstractController
  25. {
  26.     const msgRegister 'Absenden';
  27.     const msgNoUniqueTokenFound 'Es konnte kein eindeutiger Token gefunden werden.';
  28.     const msgRegisterSuccess 'Die Registrierung war erfolgreich.';
  29.     const msgPasswordChanged 'Ihr Passwort wurde erfolgreich geändert.';
  30.     const msgValidationError 'Die Validierung ist fehlgeschlagen.';
  31.     const msgValidationTooOldError'Der Validierungs-Code ist abgelaufen.';
  32.     const msgAcceptPrivacyTerms 'Mit Anklicken des Links bestätigen Sie, die <a target="_blank" href="%s">Datenschutzerklärung</a> gelesen zu haben.';
  33.     const msgDomainNotAllowed "Die Domain Ihrer E-Mail-Adresse ist nicht in der Whitelist enthalten.\nBitte wenden Sie sich an Ihren Verantwortlichen.\nIhre E-Mail-Adresse wurde nicht gespeichert.";
  34.     /**
  35.      * Does the user accept cookies and privacy terms?
  36.      *
  37.      * If not the user always gets back to the privacy terms acceptance page.
  38.      *
  39.      */
  40.      #[Route('/compliance'name'compliance')]
  41.      public function compliance(Request $request)
  42.      {
  43.          if ($request->isMethod('POST') &&
  44.              $request->get('accept_privacy_terms') &&
  45.              $request->get('accept_cookies')) {
  46.                $session $request->getSession();
  47.                    // ❗ Session manuell starten, wenn nötig
  48.                    if (!$session->isStarted()) {
  49.                        $session->start();
  50.                    }
  51.                        // ✅ Zustimmung speichern
  52.               $session->set('compliance_accepted'true);
  53.              // ✔️ Session speichern, dass User akzeptiert hat
  54.              // 🔁 Weiterleitung zur Login-Seite
  55.              return $this->redirect($this->generateUrl('_login')); // oder: return $this->redirect('/login');
  56.          }
  57.          // 👁️ GET-Aufruf: zeige Formular
  58.          return $this->render('@ProjectBizPortal/Login/compliance.html.twig');
  59.      }
  60.     public function index(Request $request)
  61.     {
  62.         $session $request->getSession();
  63.         // get the login error if there is one
  64.         if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
  65.             $error $request->attributes->get(
  66.                 Security::AUTHENTICATION_ERROR
  67.             );
  68.         } else {
  69.             $error $session->get(Security::AUTHENTICATION_ERROR);
  70.             $session->remove(Security::AUTHENTICATION_ERROR);
  71.         }
  72.         return $this->render('@ProjectBizPortal/Login/index.html.twig', [
  73.             // last username entered by the user
  74.             'features' => ['register' => $this->useRegistration()],
  75.             'last_username' => $session->get(Security::LAST_USERNAME),
  76.             'error' => $error,
  77.             'require_cookie_acceptance_at_login' => $this->getParameter('citibiz.require_cookie_acceptance_at_login'),
  78.         ]);
  79.     }
  80.     /**
  81.      * @param Request $request
  82.      *
  83.      * @return array|\Symfony\Component\HttpFoundation\Response
  84.      * @throws \Exception
  85.      */
  86.     public function recoverPassword(Request $request)
  87.     {
  88.         $form $this->createForm(PasswordRecoveryType::class);
  89.         $form->handleRequest($request);
  90.         if ($form->isSubmitted() && $form->isValid()) {
  91.             $data $form->getData();
  92.             /** @var \Doctrine\ORM\EntityManager $entityManager */
  93.             $entityManager $this->get('doctrine')->getManager();
  94.             /** @var \ProjectBiz\UserBundle\Entity\BaseUserInterface $user */
  95.             $user $entityManager
  96.                 ->getRepository($this->getUserClass())
  97.                 ->findOneBy(['username' => $data['username']]);
  98.             if ($user && $user->getEmail()) {
  99.                 $tokenType 'recover_password';
  100.                 $uniqueToken $this->getUniqueToken($entityManager$tokenType);
  101.                 $userClass $this->getParameter('projectbiz.user.user_entity_class');
  102.                 $tokenClass $userClass::TOKEN_CLASS;
  103.                 $token = new $tokenClass(
  104.                     $tokenType,
  105.                     $uniqueToken,
  106.                     $this->getParameter('citibiz.max_recover_password_age'),
  107.                     null,
  108.                     $user
  109.                 );
  110.                 $entityManager->persist($token);
  111.                 $entityManager->flush();
  112.                 // Send validation E-Mail
  113.                 $sender $this->getParameter('citibiz.email_sender');
  114.                 $subject $this->getParameter('citibiz.email_recover_password_subject');
  115.                 $message = (new \Swift_Message($subject))
  116.                     ->setFrom($sender)
  117.                     ->setTo($user->getEmail())
  118.                     ->setBody(
  119.                         $this->render(
  120.                             '@ProjectBizPortal/Email/recover_password.txt.twig',
  121.                             [
  122.                                 'token' => $token->getToken(),
  123.                                 'username' => $user->getUsername(),
  124.                                 'realname' => $user->getRealname(),
  125.                                 'href' => $this->getMailLinkGenerator()->generateUrl('_recover_password_token', [
  126.                                     'token' => $token->getToken()
  127.                                 ], true)
  128.                             ]
  129.                         )
  130.                     )
  131.                     ->addPart(
  132.                         $this->render(
  133.                             '@ProjectBizPortal/Email/recover_password.html.twig',
  134.                             [
  135.                                 'token' => $token->getToken(),
  136.                                 'username' => $user->getUsername(),
  137.                                 'realname' => $user->getRealname(),
  138.                                 'href' => $this->getMailLinkGenerator()->generateUrl('_recover_password_token', [
  139.                                     'token' => $token->getToken()
  140.                                 ])
  141.                             ]
  142.                         ), 'text/html'
  143.                     );
  144.                 $this->get('mailer')->send($message);
  145.             }
  146.             return $this->render("@ProjectBizPortal/Login/recoverPasswordSuccess.html.twig", [
  147.                 'user' => $data['username']
  148.             ]);
  149.         }
  150.         return $this->render('@ProjectBizPortal/Login/recoverPassword.html.twig',
  151.             [
  152.                 'form' => $form->createView()
  153.             ]
  154.         );
  155.     }
  156.     public function recoverPasswordToken(Request $request)
  157.     {
  158.         $userClass $this->getParameter('projectbiz.user.user_entity_class');
  159.         $tokenClass $userClass::TOKEN_CLASS;
  160.         $token $request->query->get('token');
  161.         /** @var \Doctrine\ORM\EntityManager $entityManager */
  162.         $entityManager $this->get('doctrine')->getManager();
  163.         $tokenEntity $entityManager->getRepository($tokenClass)->findOneBy(['token' => $token]);
  164.         if (!$tokenEntity) {
  165.             return $this->render('@ProjectBizPortal/Login/recoverPasswordToken.html.twig',
  166.                 [
  167.                     'missing_token' => true,
  168.                     'invalid_token' => false,
  169.                 ]
  170.             );
  171.         }
  172.         if (!$tokenEntity->isValid() || ($tokenEntity->getType() != 'recover_password')) {
  173.             return $this->render('@ProjectBizPortal/Login/recoverPasswordToken.html.twig',
  174.                 [
  175.                     'missing_token' => false,
  176.                     'invalid_token' => true,
  177.                 ]
  178.             );
  179.         }
  180.         $form $this->createForm(CustomPasswordType::class);
  181.         $form->add('create'SubmitType::class, [
  182.             'label' => self::msgRegister,
  183.         ]);
  184.         $form->handleRequest($request);
  185.         if ($form->isSubmitted() && $form->isValid()) {
  186.             $data $form->getData();
  187.             $user $tokenEntity->getUser();
  188.             if ($user) {
  189.                 $user->setPassword($data);
  190.                 $user->setModifiedBy($user);
  191.                 $user->setModifiedAt(new \DateTime());
  192.                 $entityManager->persist($user);
  193.                 $entityManager->remove($tokenEntity);
  194.                 $entityManager->flush();
  195.             }
  196.             $this->get('session')
  197.                 ->getFlashBag()
  198.                 ->add(
  199.                     'success',
  200.                     $this->get('translator')->trans(self::msgPasswordChanged)
  201.                 );
  202.             return $this->redirect($this->generateUrl('_login'));
  203.         }
  204.         return $this->render('@ProjectBizPortal/Login/recoverPasswordToken.html.twig',
  205.             [
  206.                 'missing_token' => false,
  207.                 'invalid_token' => false,
  208.                 'form' => $form->createView()
  209.             ]
  210.         );
  211.     }
  212.     public function register(Request $request)
  213.     {
  214.         if (!$this->useRegistration()) {
  215.             return $this->redirect($this->generateUrl('_login'));
  216.         }
  217.         $form $this->createForm(UserRegistrationType::class, ['email' => $request->query->get('email')], [
  218.             'additional_fields' => [
  219.                     'privacy_terms' => [
  220.                         'label' => sprintf($this->get('translator')->trans(self::msgAcceptPrivacyTerms), $this->generateUrl('pages_privacy_terms')),
  221.                         'required' => true,
  222.                         'type' => \Symfony\Component\Form\Extension\Core\Type\CheckboxType::class,
  223.                         'attr' => [
  224.                             'autocomplete' => 'off'
  225.                         ]
  226.                     ]
  227.                 ]
  228.         ]);
  229.         $form->handleRequest($request);
  230.         if ($form->isSubmitted() && $form->isValid()) {
  231.             // Create validation token (including supplied data)
  232.             $data $form->getData();
  233.             /*
  234.              * Check if the user's e-mail domain is allowed for registering.
  235.              */
  236.             if ($this->getParameter('citibiz.restrict_email_domains_on_registration')) {
  237.                 $allowedEmailDomainsStmt $this->get('citibiz.generic_repository_factory')->createGenericRepository('AllowedEmailDomains')->findAll(null, ['AllowedEmailDomains_Name']);
  238.                 $allowedEmailDomains = [];
  239.                 if ($allowedEmailDomainsStmt) {
  240.                     $allowedEmailDomains array_map(function($row) {
  241.                         return $row['AllowedEmailDomains_Name'];
  242.                     }, $allowedEmailDomainsStmt->fetchAll());
  243.                 }
  244.                 $userEmailParts explode('@'$data['email']);
  245.                 $userDomain array_pop($userEmailParts);
  246.                 if (!in_array($userDomain$allowedEmailDomains)) {
  247.                     $this->setAndTransFlashMessage(self::msgDomainNotAllowed);
  248.                     return [
  249.                         'form' => $form->createView()
  250.                     ];
  251.                 }
  252.             }
  253.             /** @var \Doctrine\ORM\EntityManager $entityManager */
  254.             $entityManager $this->get('doctrine')->getManager();
  255.             $tokenType 'validation';
  256.             $uniqueToken $this->getUniqueToken($entityManager$tokenType);
  257.             $userClass $this->getParameter('projectbiz.user.user_entity_class');
  258.             $tokenClass $userClass::TOKEN_CLASS;
  259.             $token = new $tokenClass(
  260.                 $tokenType,
  261.                 $uniqueToken,
  262.                 $this->getParameter('citibiz.max_validation_age'),
  263.                 $data
  264.             );
  265.             $entityManager->persist($token);
  266.             $entityManager->flush();
  267.             // Send validation E-Mail
  268.             $sender $this->getParameter('citibiz.email_sender');
  269.             $subject $this->getParameter('citibiz.email_registration_subject');
  270.             $privacyUrl $this->generateUrl(
  271.                 'pages_privacy_terms',
  272.                 ['slug' => 'datenschutz'],
  273.                 UrlGeneratorInterface::ABSOLUTE_URL
  274.             );
  275.             $imprintUrl $this->generateUrl(
  276.                 'pages_imprint',
  277.                 ['slug' => 'impressum'],
  278.                 UrlGeneratorInterface::ABSOLUTE_URL
  279.             );
  280.             $message = (new \Swift_Message($subject))
  281.                 ->setFrom($sender)
  282.                 ->setTo($data['email'])
  283.                 ->setBody(
  284.                     $this->render(
  285.                         '@ProjectBizPortal/Email/validation.txt.twig',
  286.                         [
  287.                             'portal_name' => $this->getParameter('citibiz.portal'),
  288.                             'token' => $token->getToken(),
  289.                             'email' => $data["email"],
  290.                             'href' => $this->getMailLinkGenerator()->generateUrl('_register_do_validate', [
  291.                                 'user_validation' => [
  292.                                     'email' => $data['email'],
  293.                                     'code' => $token->getToken()
  294.                                 ]
  295.                             ], true)
  296.  ]
  297.                     )
  298.                 )
  299.                 ->addPart(
  300.                     $this->render(
  301.                         '@ProjectBizPortal/Email/validation.html.twig',
  302.                         [
  303.                             'portal_name' => $this->getParameter('citibiz.portal'),
  304.                             'token' => $token->getToken(),
  305.                             'email' => $data["email"],
  306.                             'imprintUrl' => $imprintUrl,
  307.                             'privacyUrl' => $privacyUrl,
  308.                             'href' => $this->getMailLinkGenerator()->generateUrl('_register_do_validate', [
  309.                                 'user_validation' => [
  310.                                     'email' => $data['email'],
  311.                                     'code' => $token->getToken()
  312.                                 ]
  313.                             ], true)
  314.                         ]
  315.                     ),
  316.                     'text/html'
  317.                 );
  318.             $this->get('mailer')->send($message);
  319.             $this->get('projectbiz.portal.user_interaction.event_dispatcher')->dispatch(
  320.                 UserInteractionEvent::EVENT,
  321.                 new UserInteractionEvent(UserInteractionEvent::EVENT_REGISTRATION_BEGIN, [
  322.                         'registration' => $data
  323.                 ])
  324.             );
  325.             return $this->redirect($this->generateUrl('_register_validate', ['email' => $data['email']]));
  326.         }
  327.         return $this->render('@ProjectBizPortal/Login/register.html.twig',
  328.             [
  329.                 'form' => $form->createView()
  330.             ]
  331.         );
  332.     }
  333.     /**
  334.      * @param Request $request
  335.      *
  336.      * @return array|RedirectResponse
  337.      */
  338.     public function registerValidation(Request $request)
  339.     {
  340.         if (!$this->useRegistration()) {
  341.             return $this->redirect($this->generateUrl('_login'));
  342.         }
  343.         $data = [
  344.             'email' => $request->query->get('email')
  345.         ];
  346.         $form $this->createForm(UserValidationType::class, $data, [
  347.             'action' => $this->generateUrl('_register_do_validate'),
  348.             'method' => 'GET',
  349.             'csrf_protection' => false
  350.         ]);
  351.         return $this->render('@ProjectBizPortal/Login/registerValidation.html.twig', [
  352.             'form' => $form->createView()
  353.         ]);
  354.     }
  355.     /**
  356.      * @param Request $request
  357.      *
  358.      * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
  359.      */
  360.     public function registerValidate(Request $request)
  361.     {
  362.         $userClass $this->getParameter('projectbiz.user.user_entity_class');
  363.         $tokenClass $userClass::TOKEN_CLASS;
  364.         $form $this->createForm(UserValidationType::class, [], [
  365.             'method' => 'GET',
  366.             'csrf_protection' => false
  367.         ]);
  368.         $form->handleRequest($request);
  369.         if ($form->isSubmitted() && !$form->isValid()) {
  370.             $this
  371.                 ->get('session')
  372.                 ->getFlashBag()
  373.                 ->add(
  374.                     'danger',
  375.                     $this->get('translator')->trans(self::msgValidationError)
  376.                 );
  377.             return $this->redirect($this->generateUrl('_register_validate'));
  378.         }
  379.         $data $form->getData();
  380.         /** @var \Doctrine\ORM\EntityManager $em */
  381.         $em $this->get('doctrine')->getManager();
  382.         $token $em->getRepository($tokenClass)->findBy(['token' => $data['code']]);
  383.         // Check a/ if $token b/ $token has correct email c/ $token is not too old
  384.         if (!((count($token) == 1) && ($token[0]->getData()['email'] == $data['email']) && $token[0]->isValid())) {
  385.             // Error - show error message
  386.             if ((count($token) == 1) && !$token[0]->isValid()) {
  387.                 $this
  388.                     ->get('session')
  389.                     ->getFlashBag()
  390.                     ->add(
  391.                         'danger',
  392.                         $this->get('translator')->trans(self::msgValidationTooOldError)
  393.                     );
  394.                 return $this->redirect($this->generateUrl('_register', ['email' => $data['email']]));
  395.             }
  396.             $this
  397.                 ->get('session')
  398.                 ->getFlashBag()
  399.                 ->add(
  400.                     'danger',
  401.                     $this->get('translator')->trans(self::msgValidationError)
  402.                 );
  403.             return $this->redirect($this->generateUrl('_register_validate', ['email' => $data['email']]));
  404.         }
  405.         // Valid - ask for username and password - token and email are stored hidden
  406.         $form $this->createForm(UserCredentialsType::class, $data, [
  407.             'action' => $this->generateUrl('_register_credentials'),
  408.             'use_realname' => $this->getParameter('citibiz.registration_use_realname')
  409.         ]);
  410.         return $this->render('@ProjectBizPortal/Login/registerCredentials.html.twig', [
  411.             'form' => $form->createView()
  412.         ]);
  413.     }
  414.     /**
  415.      * @param Request $request
  416.      *
  417.      * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
  418.      * @throws \Doctrine\DBAL\ConnectionException
  419.      * @throws \Exception
  420.      */
  421.     public function registerCredentials(Request $request)
  422.     {
  423.         $form $this->createForm(UserCredentialsType::class, ['use_realname' => true]);
  424.         $form->handleRequest($request);
  425.         if ($form->isSubmitted() && $form->isValid()) {
  426.             $data $form->getData();
  427.             $success true;
  428.             try {
  429.                 $this->handleCredentialsFormData($data$request);
  430.                 $this->get('projectbiz.portal.user_interaction.event_dispatcher')->dispatch(
  431.                     UserInteractionEvent::EVENT,
  432.                     new UserInteractionEvent(UserInteractionEvent::EVENT_REGISTRATION_END, [
  433.                         'registration' => $data
  434.                     ])
  435.                 );
  436.             } catch (ValidationTokenExpiredException $ex) {
  437.                 $this->setAndTransFlashMessage($ex->getMessage());
  438.                 return $this->redirect($this->generateUrl('_register', ['email' => $data['email']]));
  439.             }
  440.             catch(ValidationTokenInvalidException $ex) {
  441.                 $this->setAndTransFlashMessage($ex->getMessage());
  442.                 return $this->redirect($this->generateUrl('_register_validate', ['email' => $data['email']]));
  443.             }
  444.             catch(UserNotCreatedException $ex) {
  445.                 $this->setAndTransFlashMessage($ex->getMessage());
  446.                 $success false;
  447.             }
  448.             catch(DuplicateUsernameException $ex) {
  449.                 $this->setAndTransFlashMessage($ex->getMessage());
  450.                 $success false;
  451.             }
  452.             catch (UniqueConstraintViolationException $ex) {
  453.                 $this->setAndTransFlashMessage(DuplicateUsernameException::MSG_DUPLICATE_USERNAME);
  454.                 $success false;
  455.             }
  456.             if ($success) {
  457.                 $this->setAndTransFlashMessage(self::msgRegisterSuccess'success');
  458.                 return $this->redirect($this->generateUrl('portal'));
  459.             }
  460.         }
  461.         return $this->render('@ProjectBizPortal/Login/registerCredentials.html.twig',
  462.             [
  463.                 'form' => $form->createView()
  464.             ]
  465.         );
  466.     }
  467.     protected function getUserClass()
  468.     {
  469.         return $this->getParameter('projectbiz.user.user_entity_class');
  470.     }
  471.     /**
  472.      * @param EntityManager $em
  473.      * @param               $tokenType
  474.      *
  475.      * @return mixed
  476.      *
  477.      * @throws \Exception
  478.      */
  479.     private function getUniqueToken(EntityManager $em$tokenType)
  480.     {
  481.         $userClass $this->getParameter('projectbiz.user.user_entity_class');
  482.         $tokenClass $userClass::TOKEN_CLASS;
  483.         $maxTrys 1000;
  484.         while ($maxTrys 0) {
  485.             $tokenString $this->get('citibiz.token_factory')->createToken($tokenType);
  486.             $identicalTokens $em
  487.                 ->getRepository($tokenClass)
  488.                 ->findBy(['token' => $tokenString]);
  489.             if (count($identicalTokens) == 0) {
  490.                 return $tokenString;
  491.             }
  492.             $maxTrys--;
  493.         }
  494.         throw new \Exception(self::msgNoUniqueTokenFound);
  495.     }
  496.     private function setAndTransFlashMessage($message$type 'danger') {
  497.         $this
  498.             ->get('session')
  499.             ->getFlashBag()
  500.             ->add(
  501.                 $type,
  502.                 $this->get('translator')->trans($message)
  503.             );
  504.     }
  505.     /**
  506.      * @return \Doctrine\ORM\EntityManager
  507.      */
  508.     private function getEntityManager()
  509.     {
  510.         return $this->get('doctrine')->getManager();
  511.     }
  512.     private function handleCredentialsFormData($dataRequest $request)
  513.     {
  514.         $userClass $this->getParameter('projectbiz.user.user_entity_class');
  515.         $tokenClass $userClass::TOKEN_CLASS;
  516.         $entityManager $this->getEntityManager();
  517.         // Check token (again)
  518.         /** @var \ProjectBiz\UserBundle\Entity\Token[] $token */
  519.         $token $entityManager
  520.             ->getRepository($tokenClass)
  521.             ->findBy(['token' => $data['code']]);
  522.         if (!((count($token) == 1) && ($token[0]->getData()['email'] == $data['email']) && $token[0]->isValid())) {
  523.             // Error - show error message
  524.             if ((count($token) == 1) && !$token[0]->isValid()) {
  525.                 throw new ValidationTokenExpiredException();
  526.             }
  527.             throw new ValidationTokenInvalidException();
  528.         }
  529.         $this->createAndLoginUser($data$token$request);
  530.     }
  531.     private function createAndLoginUser($data$tokenRequest $request)
  532.     {
  533.         $entityManager $this->getEntityManager();
  534.         // Create user
  535.         $realname null;
  536.         if ($this->getParameter('citibiz.registration_use_realname')) {
  537.             $realname $data['realname'];
  538.         }
  539.         $className $this->getUserClass();
  540.         /** @var BaseUserInterface $user */
  541.         $user = new $className(
  542.             $data['username'],
  543.             $data['password'],
  544.             $realname,
  545.             $data['email'],
  546.             $this->getParameter('citibiz.active_after_registration'),
  547.             $this->getParameter('citibiz.rights_after_registration')
  548.         );
  549.         $userProvider $this->get('projectbiz.user.user_provider');
  550.         $admin        $userProvider->loadUserByUsername('admin');
  551.         // Transactional to ensure unique usernames
  552.         $entityManager->getConnection()->beginTransaction();
  553.         try {
  554.             $user->setModifiedBy($admin);
  555.             $entityManager->persist($user);
  556.             if ($user->getRights()) {
  557.                 $user->getRights()->setModifiedBy($user);
  558.                 $entityManager->persist($user->getRights());
  559.             }
  560.             $entityManager->remove($token[0]);
  561.             $user->setCreatedBy($user);
  562.             $entityManager->persist($user);
  563.             $entityManager->flush();
  564.             $users $entityManager
  565.                 ->getRepository($this->getUserClass())
  566.                 ->findBy(['username' => $data['username']]);
  567.             if (count($users) == 0) {
  568.                 throw new UserNotCreatedException();
  569.             }
  570.             if (count($users) > 1) {
  571.                 throw new DuplicateUsernameException();
  572.             }
  573.         } catch (\Exception $ex) {
  574.             $entityManager->getConnection()->rollBack();
  575.             throw($ex);
  576.         }
  577.         $entityManager->getConnection()->commit();
  578.         // Login User
  579.         if ($this->getParameter('citibiz.login_after_registration')) {
  580.             // Here, "main" is the name of the firewall in your security.yml
  581.             $secToken = new UsernamePasswordToken($user$user->getPassword(), "main"$user->getRoles());
  582.             $this->get("security.token_storage")->setToken($secToken);
  583.             // Fire the login event
  584.             // Logging the user in above the way we do it doesn't do this automatically
  585.             $event = new InteractiveLoginEvent($request$secToken);
  586.             $this->get("event_dispatcher")->dispatch("security.interactive_login"$event);
  587.             $session $request->getSession();
  588.             $session->set('_security_main'serialize($secToken));
  589.         }
  590.     }
  591.     private function useRegistration()
  592.     {
  593.         if ($useRegistration $this->getParameter('citibiz.use_registration')) {
  594.             return $useRegistration;
  595.         }
  596.         return false;
  597.     }
  598.     /**
  599.      * @return \ProjectBiz\PortalBundle\Service\MailLinkGenerator
  600.      */
  601.     private function getMailLinkGenerator()
  602.     {
  603.         return $this->get('projectbiz.portal.mail_link_generator');
  604.     }
  605. }