Spaces:
No application file
No application file
namespace Mautic\UserBundle\Security\Authenticator; | |
use Mautic\PluginBundle\Helper\IntegrationHelper; | |
use Mautic\UserBundle\Entity\User; | |
use Mautic\UserBundle\Event\AuthenticationEvent; | |
use Mautic\UserBundle\Security\Authentication\Token\PluginToken; | |
use Mautic\UserBundle\UserEvents; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
use Symfony\Component\HttpFoundation\JsonResponse; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
use Symfony\Component\HttpFoundation\Response; | |
use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface; | |
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; | |
use Symfony\Component\Security\Core\Exception\AuthenticationException; | |
use Symfony\Component\Security\Core\User\UserProviderInterface; | |
class PreAuthAuthenticator implements AuthenticationProviderInterface | |
{ | |
public function __construct( | |
protected IntegrationHelper $integrationHelper, | |
protected EventDispatcherInterface $dispatcher, | |
protected RequestStack $requestStack, | |
protected UserProviderInterface $userProvider, | |
protected $providerKey | |
) { | |
} | |
/** | |
* @return Response|PluginToken | |
*/ | |
public function authenticate(TokenInterface $token) | |
{ | |
if (!$this->supports($token)) { | |
return null; | |
} | |
$user = $token->getUser(); | |
$authenticatingService = $token->getAuthenticatingService(); | |
$response = null; | |
$request = $this->requestStack->getCurrentRequest(); | |
if (!$user instanceof User) { | |
$authenticated = false; | |
// Try authenticating with a plugin | |
if ($this->dispatcher->hasListeners(UserEvents::USER_PRE_AUTHENTICATION)) { | |
$integrations = $this->integrationHelper->getIntegrationObjects($authenticatingService, ['sso_service'], false, null, true); | |
$loginCheck = ('mautic_sso_login_check' == $request->attributes->get('_route')); | |
$authEvent = new AuthenticationEvent( | |
null, | |
$token, | |
$this->userProvider, | |
$request, | |
$loginCheck, | |
$authenticatingService, | |
$integrations | |
); | |
$this->dispatcher->dispatch($authEvent, UserEvents::USER_PRE_AUTHENTICATION); | |
if ($authenticated = $authEvent->isAuthenticated()) { | |
$eventToken = $authEvent->getToken(); | |
if ($eventToken !== $token) { | |
// A custom token has been set by the plugin so just return it | |
return $eventToken; | |
} | |
$user = $authEvent->getUser(); | |
$authenticatingService = $authEvent->getAuthenticatingService(); | |
} | |
$response = $authEvent->getResponse(); | |
if (!$authenticated && $loginCheck && !$response) { | |
// Set an empty JSON response | |
$response = new JsonResponse([]); | |
} | |
} | |
if (!$authenticated && empty($response)) { | |
throw new AuthenticationException('mautic.user.auth.error.invalidlogin'); | |
} | |
} | |
return new PluginToken( | |
$this->providerKey, | |
$authenticatingService, | |
$user, | |
($user instanceof User) ? $user->getPassword() : '', | |
($user instanceof User) ? $user->getRoles() : [], | |
$response | |
); | |
} | |
public function supports(TokenInterface $token): bool | |
{ | |
return $token instanceof PluginToken && $token->getProviderKey() === $this->providerKey; | |
} | |
} | |