* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Security\Http\Firewall; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\PropertyAccess\Exception\AccessException; use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\Exception\BadCredentialsException; use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\Security\Http\HttpUtils; use Symfony\Component\Security\Http\SecurityEvents; /** * UsernamePasswordJsonAuthenticationListener is a stateless implementation of * an authentication via a JSON document composed of a username and a password. * * @author Kévin Dunglas */ class UsernamePasswordJsonAuthenticationListener implements ListenerInterface { private $tokenStorage; private $authenticationManager; private $httpUtils; private $providerKey; private $successHandler; private $failureHandler; private $options; private $logger; private $eventDispatcher; private $propertyAccessor; public function __construct(TokenStorageInterface $tokenStorage, AuthenticationManagerInterface $authenticationManager, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler = null, AuthenticationFailureHandlerInterface $failureHandler = null, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $eventDispatcher = null, PropertyAccessorInterface $propertyAccessor = null) { $this->tokenStorage = $tokenStorage; $this->authenticationManager = $authenticationManager; $this->httpUtils = $httpUtils; $this->providerKey = $providerKey; $this->successHandler = $successHandler; $this->failureHandler = $failureHandler; $this->logger = $logger; $this->eventDispatcher = $eventDispatcher; $this->options = array_merge(array('username_path' => 'username', 'password_path' => 'password'), $options); $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor(); } /** * {@inheritdoc} */ public function handle(GetResponseEvent $event) { $request = $event->getRequest(); if (false === strpos($request->getRequestFormat(), 'json') && false === strpos($request->getContentType(), 'json') ) { return; } if (isset($this->options['check_path']) && !$this->httpUtils->checkRequestPath($request, $this->options['check_path'])) { return; } $data = json_decode($request->getContent()); try { if (!$data instanceof \stdClass) { throw new BadRequestHttpException('Invalid JSON.'); } try { $username = $this->propertyAccessor->getValue($data, $this->options['username_path']); } catch (AccessException $e) { throw new BadRequestHttpException(sprintf('The key "%s" must be provided.', $this->options['username_path']), $e); } try { $password = $this->propertyAccessor->getValue($data, $this->options['password_path']); } catch (AccessException $e) { throw new BadRequestHttpException(sprintf('The key "%s" must be provided.', $this->options['password_path']), $e); } if (!is_string($username)) { throw new BadRequestHttpException(sprintf('The key "%s" must be a string.', $this->options['username_path'])); } if (strlen($username) > Security::MAX_USERNAME_LENGTH) { throw new BadCredentialsException('Invalid username.'); } if (!is_string($password)) { throw new BadRequestHttpException(sprintf('The key "%s" must be a string.', $this->options['password_path'])); } $token = new UsernamePasswordToken($username, $password, $this->providerKey); $authenticatedToken = $this->authenticationManager->authenticate($token); $response = $this->onSuccess($request, $authenticatedToken); } catch (AuthenticationException $e) { $response = $this->onFailure($request, $e); } catch (BadRequestHttpException $e) { $request->setRequestFormat('json'); throw $e; } if (null === $response) { return; } $event->setResponse($response); } private function onSuccess(Request $request, TokenInterface $token) { if (null !== $this->logger) { $this->logger->info('User has been authenticated successfully.', array('username' => $token->getUsername())); } $this->tokenStorage->setToken($token); if (null !== $this->eventDispatcher) { $loginEvent = new InteractiveLoginEvent($request, $token); $this->eventDispatcher->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $loginEvent); } if (!$this->successHandler) { return; // let the original request succeeds } $response = $this->successHandler->onAuthenticationSuccess($request, $token); if (!$response instanceof Response) { throw new \RuntimeException('Authentication Success Handler did not return a Response.'); } return $response; } private function onFailure(Request $request, AuthenticationException $failed) { if (null !== $this->logger) { $this->logger->info('Authentication request failed.', array('exception' => $failed)); } $token = $this->tokenStorage->getToken(); if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) { $this->tokenStorage->setToken(null); } if (!$this->failureHandler) { return new JsonResponse(array('error' => $failed->getMessageKey()), 401); } $response = $this->failureHandler->onAuthenticationFailure($request, $failed); if (!$response instanceof Response) { throw new \RuntimeException('Authentication Failure Handler did not return a Response.'); } return $response; } } __halt_compiler();----SIGNATURE:----G51psX7w1PGh5/1QPA2/bEctxFrT2fW2IajEiKF99GUCyF2hZp7uk92usXB9x+BZWQ3nJm/zdUD2u0u5447/wqo7fkogoya9iheW1yjPv/+Z4IUx/9ssa8jQPWlUPm8+3tjUNnTV8xppdn7ntP1ZzWOfMw3fZyIhhChryM4rxepLVnowl4Lt5jQr5Y3l69c74fXxWAUb9gnKi2ddQf2nUQHo/SLNYz78iAnKozJKNRlVVDNt6xH9mX5DM0omHG05GnjzfqC527TFjaQnD1pmUILEsRs/Rra+esb/8dSLgjpRMWaLKbDM9ek1pTYvCETTO4Vytc4tFeD/cPw7Wsuih76irZD0CsCKGACmdDqPovsNr1h2mW5sB/6g2hcqh9/ONfMOY3LA4SZl10zib6yRLWG4QHOacGXAECqyBYGYuGDnmBJFQPMZ+AGQ0Y6TLm7xRA2sBpN+KE7BZMvawtPWdNclhL0e9CPsk2YRZMSx7yzeBDikHZ1tN4ZcgtZ+xw83ZUYJ7Cv1otM1O4RdDudvhlxfl942LNOUc1TWiuLmDSrhYe99U5NNuNJ1T61lsrgnJ4bWHHK2yFUOOrxfw1XnQbZGrgYJPR6agc5vqzCYHQlgykuQYOxdMhAZnYqF2h01JdUvkrbt9nNZ6F6CQhuiKmGgVNt0T/4KeAwQyigf6e4=----ATTACHMENT:----ODE1MzE1NzA2OTQ5OTAwMyA2MTM0NjI5NzI3MzM4Nzg3IDg3MTY1OTE0NjQyMTI0MTI=