src/Controller/LoginController.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use DateTime;
  5. use Exception;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Security\Core\Security;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  13. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  14. class LoginController extends AbstractController
  15. {
  16.     
  17.     /**
  18.      * @Route("/login", name="login")
  19.      */
  20.     public function index(EntityManagerInterface $entityManager,AuthenticationUtils $authenticationUtils,Request $request): Response
  21.     {
  22.         $error null;
  23.         $username $request->request->get('_username');
  24.         $password $request->request->get('_password');
  25.         //Récupération des credentials
  26.         $uid "uid=".$username;
  27.         $credentials = [
  28.             'username' => $username,
  29.             'password' => $password,
  30.             'csrf_token' => $request->request->get('_csrf_token'),
  31.         ];
  32.         $request->getSession()->set(
  33.             Security::LAST_USERNAME,
  34.             $credentials['username']
  35.         );
  36.         //Infos connexion ldap
  37.         $ldap_host 'ldap-authentification.inra.fr';
  38.         $base_dn 'dc=inra,dc=fr';
  39.         //Connexion au ldap
  40.         $connect ldap_connect($ldap_host); // Vérification syntaxique plausibilité de connexion
  41.                     
  42.         //Options du ldap
  43.         ldap_set_option($connectLDAP_OPT_PROTOCOL_VERSION3);
  44.         ldap_set_option($connectLDAP_OPT_REFERRALS0);
  45.             
  46.         //Recherche de l'utilisateur
  47.         try{
  48.             $read ldap_search($connect,$base_dn$uid);
  49.             //Recherche des infos concernant l'utilisateur
  50.             $info ldap_get_entries($connect$read);
  51.             if (count($info)>1)
  52.                 {
  53.                     $bind false;
  54.                     //Try catch pour couvrir les exceptions
  55.                     try {
  56.                         //Bind avec le password pour vérifier l'autorisation
  57.                         $bind ldap_bind($connect,$info[0]["dn"],$password);
  58.                     } catch (Exception $e) {
  59.                         $error "Mot de passe incorrect pour l'utilisateur '" $username "'";
  60.                     }
  61.                     
  62.                     if ($bind){
  63.                         $user $entityManager->getRepository(User::class)->findOneBy(['username' => $credentials['username']]);
  64.                         if($user == null){
  65.                             $user = new User();
  66.                             $user->setPassword("ldap");
  67.                             $user->setUsernameCanonical($username);
  68.                             $user->setUsername($username);
  69.                             $user->setNom($info[0]['sn'][0]);
  70.                             $user->setEmail($info[0]['mail'][0]);
  71.                             $user->setEnabled(1);
  72.                             $user->setEmailCanonical($info[0]['mail'][0]);
  73.                             $user->setSalt('???');
  74.                             $user->setLastLogin(new DateTime());
  75.                             $user->setRoles(["ROLE_USER"]);
  76.                             $user->setDn($info[0]['dn']);
  77.                             $user->setPrenom($info[0]['givenname'][0]);
  78.                             $user->setLogin($username);
  79.                             $user->setActif(0);
  80.                             $user->setMobileMdp("mobilepassword");
  81.                             $entityManager->persist($user);                   
  82.                             $entityManager->flush();
  83.                         }
  84.                     } 
  85.                 }else if($username != null)
  86.                 {
  87.                     $error "L'utilisateur '" $username "' n'existe pas";
  88.                 }
  89.                 if (isset($user)) {
  90.                     if($request->request->get('_remind') != null) {
  91.                         //TODO : Mettre en mémoire l'utilisateur (cookie ??? Securité ??)
  92.                         //TODO : Mettre en mémoire le ldap de l'utilisateur pour pré remplir le champ
  93.                         throw new Exception('Faire les TODO au dessus');
  94.                     }
  95.                     $token = new UsernamePasswordToken($user$user->getPassword(),"main"$user->getRoles());
  96.                     $this->get("security.token_storage")->setToken($token); 
  97.                     return $this->redirectToRoute('accueil');
  98.                 }
  99.             }catch(Exception $e){
  100.                 // $user = $entityManager->getRepository(Utilisateur::class)->findOneBy(['username' => 'mreichstadt']);
  101.                 // $token = new UsernamePasswordToken($user, $user->getPassword(),"main", $user->getRoles());
  102.                 // $this->get("security.token_storage")->setToken($token); 
  103.                 echo $e->getMessage();
  104.                 exit;
  105.                 return $this->redirectToRoute('login');
  106.             }
  107.         
  108.         
  109.         $lastUsername $authenticationUtils->getLastUsername();
  110.         return $this->render('login/index.html.twig', ['last_username' => $lastUsername'error' => $error]);
  111.     }
  112.     /**
  113.      * @Route("/logout", name="logout")
  114.      */
  115.     public function logout(){
  116.         //Force logout
  117.     }
  118. }