<?php
namespace App\Controller;
use App\Entity\User;
use DateTime;
use Exception;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
class LoginController extends AbstractController
{
/**
* @Route("/login", name="login")
*/
public function index(EntityManagerInterface $entityManager,AuthenticationUtils $authenticationUtils,Request $request): Response
{
$error = null;
$username = $request->request->get('_username');
$password = $request->request->get('_password');
//Récupération des credentials
$uid = "uid=".$username;
$credentials = [
'username' => $username,
'password' => $password,
'csrf_token' => $request->request->get('_csrf_token'),
];
$request->getSession()->set(
Security::LAST_USERNAME,
$credentials['username']
);
//Infos connexion ldap
$ldap_host = 'ldap-authentification.inra.fr';
$base_dn = 'dc=inra,dc=fr';
//Connexion au ldap
$connect = ldap_connect($ldap_host); // Vérification syntaxique plausibilité de connexion
//Options du ldap
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
//Recherche de l'utilisateur
try{
$read = ldap_search($connect,$base_dn, $uid);
//Recherche des infos concernant l'utilisateur
$info = ldap_get_entries($connect, $read);
if (count($info)>1)
{
$bind = false;
//Try catch pour couvrir les exceptions
try {
//Bind avec le password pour vérifier l'autorisation
$bind = ldap_bind($connect,$info[0]["dn"],$password);
} catch (Exception $e) {
$error = "Mot de passe incorrect pour l'utilisateur '" . $username . "'";
}
if ($bind){
$user = $entityManager->getRepository(User::class)->findOneBy(['username' => $credentials['username']]);
if($user == null){
$user = new User();
$user->setPassword("ldap");
$user->setUsernameCanonical($username);
$user->setUsername($username);
$user->setNom($info[0]['sn'][0]);
$user->setEmail($info[0]['mail'][0]);
$user->setEnabled(1);
$user->setEmailCanonical($info[0]['mail'][0]);
$user->setSalt('???');
$user->setLastLogin(new DateTime());
$user->setRoles(["ROLE_USER"]);
$user->setDn($info[0]['dn']);
$user->setPrenom($info[0]['givenname'][0]);
$user->setLogin($username);
$user->setActif(0);
$user->setMobileMdp("mobilepassword");
$entityManager->persist($user);
$entityManager->flush();
}
}
}else if($username != null)
{
$error = "L'utilisateur '" . $username . "' n'existe pas";
}
if (isset($user)) {
if($request->request->get('_remind') != null) {
//TODO : Mettre en mémoire l'utilisateur (cookie ??? Securité ??)
//TODO : Mettre en mémoire le ldap de l'utilisateur pour pré remplir le champ
throw new Exception('Faire les TODO au dessus');
}
$token = new UsernamePasswordToken($user, $user->getPassword(),"main", $user->getRoles());
$this->get("security.token_storage")->setToken($token);
return $this->redirectToRoute('accueil');
}
}catch(Exception $e){
// $user = $entityManager->getRepository(Utilisateur::class)->findOneBy(['username' => 'mreichstadt']);
// $token = new UsernamePasswordToken($user, $user->getPassword(),"main", $user->getRoles());
// $this->get("security.token_storage")->setToken($token);
echo $e->getMessage();
exit;
return $this->redirectToRoute('login');
}
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('login/index.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/logout", name="logout")
*/
public function logout(){
//Force logout
}
}