82 lines
2.5 KiB
PHP
82 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
use App\Entity\User;
|
|
use App\Hydra\Client;
|
|
use App\Hydra\HydraService;
|
|
use App\SQLLogin\SQLLoginRequest;
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
|
|
use Symfony\Component\Finder\Exception\AccessDeniedException;
|
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\HttpFoundation\Session\SessionInterface;
|
|
use Symfony\Component\Routing\Annotation\Route;
|
|
|
|
class MainController extends AbstractController
|
|
{
|
|
private HydraService $hydra;
|
|
private Client $client;
|
|
private SessionInterface $session;
|
|
|
|
public function __construct(SessionInterface $session, HydraService $hydra, Client $client)
|
|
{
|
|
$this->session = $session;
|
|
$this->client = $client;
|
|
$this->hydra = $hydra;
|
|
}
|
|
|
|
#[Route('/', name: 'app_home')]
|
|
public function home(Request $request): RedirectResponse
|
|
{
|
|
return $this->hydra->handleLoginRequest($request);
|
|
}
|
|
|
|
/*
|
|
* Route de Healthcheck (notament pour kubernetes)
|
|
*/
|
|
#[Route('/health', name: 'health')]
|
|
public function health(Request $request): Response
|
|
{
|
|
return new Response('healthy', 200);
|
|
}
|
|
|
|
#[Route('/connect/login-accept', name: 'app_login_accept', methods: ['GET'])]
|
|
public function loginAccept(SQLLoginRequest $sqlLoginRequest): RedirectResponse
|
|
{
|
|
$user = $this->getUser();
|
|
|
|
if (!$user instanceof User) {
|
|
throw new AccessDeniedException();
|
|
}
|
|
$challenge = $this->session->get('challenge');
|
|
if (!$challenge) {
|
|
return new RedirectResponse($this->getParameter('issuer_url'));
|
|
}
|
|
|
|
$subject = $user->getLogin();
|
|
|
|
$subjectRewriteExpression = $sqlLoginRequest->getSubjectRewriteExpression();
|
|
if (null != $subjectRewriteExpression) {
|
|
$expressionLanguage = new ExpressionLanguage();
|
|
|
|
$subject = $expressionLanguage->evaluate($subjectRewriteExpression, $user->getAttributes());
|
|
}
|
|
|
|
$loginAcceptRes = $this->client->acceptLoginRequest($challenge, [
|
|
'subject' => $subject,
|
|
'remember' => true,
|
|
])->toArray();
|
|
|
|
return new RedirectResponse($loginAcceptRes['redirect_to']);
|
|
}
|
|
|
|
#[Route('/connect/consent', name: 'app_consent')]
|
|
public function consent(Request $request): RedirectResponse
|
|
{
|
|
return $this->hydra->handleConsentRequest($request);
|
|
}
|
|
}
|