You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.9 KiB
135 lines
4.9 KiB
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
use App\Entity\SfyCASSession;
|
|
use App\Repository\SfyCASSessionRepository;
|
|
use App\Service\SfyCASTicketGenerator;
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\Routing\Annotation\Route;
|
|
use Symfony\Component\HttpFoundation\Cookie;
|
|
use Symfony\Component\Routing\Generator\UrlGenerator;
|
|
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
class SfyCASLoginController extends AbstractController
|
|
{
|
|
/**
|
|
* @Route("/", name="app_home")
|
|
*/
|
|
public function index(AuthenticationUtils $authenticationUtils, LoggerInterface $logger): Response
|
|
{
|
|
if(! $this->getUser() ) {
|
|
$logger->debug('SFYCAS: redirecting');
|
|
return $this->redirectToRoute('app_cas_login');
|
|
} else {
|
|
$logger->debug('SFYCAS: user already authenticated');
|
|
return $this->render('sfy_cas_login/index.html.twig', [
|
|
'controller_name' => 'SfyCASLoginController',
|
|
]);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @Route("/cas/login", name="app_cas_login")
|
|
*/
|
|
public function login(AuthenticationUtils $authenticationUtils,
|
|
Request $request,
|
|
LoggerInterface $logger,
|
|
SfyCASSessionRepository $sfyCASSessionRepository,
|
|
SfyCASTicketGenerator $ticketGenerator): Response
|
|
{
|
|
if ($this->getUser()) {
|
|
//return $this->redirectToRoute('target_path');
|
|
/*echo '<pre>';
|
|
print_r($request->query->get('service'));
|
|
echo '<br>';
|
|
*/
|
|
$user = $this->getUser();
|
|
|
|
$_casSession=$sfyCASSessionRepository->findBy(['user' => $this->getUser()]);
|
|
if(is_array($_casSession) && count($_casSession) > 0) {
|
|
$casSession=$_casSession[0];
|
|
$ticket=$casSession->getTicket();
|
|
$logger->info('SFYCAS ticket ' . $casSession->getTicket() . ' found for user : ' . $user);
|
|
|
|
} else {
|
|
$logger->info('SFYCAS Session : create new cas session');
|
|
$casSession=new SfyCASSession();
|
|
$ticket=$ticketGenerator->getTicket();
|
|
$casSession->setLogin($user->getUsername());
|
|
$casSession->setUser($user);
|
|
$casSession->setTicket('ST-' . $ticket);
|
|
}
|
|
|
|
$chemin=$request->getBasePath();
|
|
|
|
//$logger->info('SFYCAS login base url : ' . $request);
|
|
$service=$request->query->get('service');
|
|
//$user=$this->getUser();
|
|
//echo $user->getUsername();
|
|
//$ticket=$ticketGenerator->getTicket();
|
|
|
|
//$casSession->setLogin($user->getUsername());
|
|
//$casSession->setUser($user);
|
|
//$casSession->setTicket('ST-' . $ticket);
|
|
$entityManager = $this->getDoctrine()->getManager();
|
|
$entityManager->persist($casSession);
|
|
$entityManager->flush();
|
|
|
|
//$response = new RedirectResponse($service. '?ticket=ST-ABFDABFE');
|
|
|
|
$attributes = parse_url($service);
|
|
//$params = $attributes['query'];
|
|
if(isset($attributes['query'])) {
|
|
$responseUrl = $service. '&ticket=ST-'.$ticket;
|
|
} else {
|
|
$responseUrl = $service. '?ticket=ST-'.$ticket;
|
|
}
|
|
|
|
|
|
//$response = new RedirectResponse($service. '?ticket=ST-' . $ticket);
|
|
$response = new RedirectResponse($responseUrl);
|
|
/*$response->headers->set('Set-Cookie',
|
|
Cookie::create(
|
|
'sfy_cas_session',
|
|
$casSession->getTicket(),
|
|
time() + 60 * 60 * 24 * 30,
|
|
'/',
|
|
null,
|
|
false,
|
|
true,
|
|
false,
|
|
Cookie::SAMESITE_LAX
|
|
)
|
|
);
|
|
*/
|
|
|
|
$response->headers->setCookie(Cookie::create('CASTGC', 'ST-' . $ticket));
|
|
$logger->info('SFYCAS login user : ' . $user . 'ticket ' . $ticket . ' service : ' . $service);
|
|
|
|
return $response;
|
|
//return $this->redirect($service. '?ticket=ST-ABFDABFE');
|
|
|
|
}
|
|
|
|
// get the login error if there is one
|
|
$error = $authenticationUtils->getLastAuthenticationError();
|
|
// last username entered by the user
|
|
$lastUsername = $authenticationUtils->getLastUsername();
|
|
|
|
return $this->render('sfy_cas_login/caslogin.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
|
|
}
|
|
|
|
/**
|
|
* @Route("/cas/logout", name="app_cas_logout")
|
|
*/
|
|
public function logout()
|
|
{
|
|
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
|
|
}
|
|
}
|
|
|