* * 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:----Zl4rY8FMxrNkNZW1BGZGgNX3beCVsao4khYQi+xNxZ7PYjmHFKGdCn0EE270KAu2WM9nRLvbdsmxAlffnkfQxys8rn63HTTHTwqWccH9Y2UcuBq/Sfs7hCIEYojw6gqu/Ufk7WYaRvzxGSCAKn6ZRIP6iADZfAragKtBm8KMXu26P+rDKYMPLWeMaG0UvXvHFB57Dw5e8GkSdH9CGFcIunX8gNQy0m7UOJBgBBYIPW5kLGU3KjhnmOs/GeQ/v3g5Fqg6m8c6Eq12lDKPQedRUV6l+YHx3YgVBQomj/kcXz/LAEFoCUUR/psUAgcwFN9e1Yqa9hsx8Ypx1f/6P/jeK+o1ebUK7L9YGrdYHRsebq1OLoKK7+Y5v93nZJhBp6esd1zvuLGyPu2738fUzMBQ3v+DLVPhlOhgsaETnPkLiUmHUvziNwM4a9LqNUGFXA1Bu3q9iVtD8cJpb3m2VpcHya5dimvDg9ZGTS0M7szzh4z1r/0xsrLMmjpmlcVP6/BWjfkziWEiDyP0eY/SGp49jhk2Au1ie6YYGSsxnVoy+kvBF5UeStKXCjXZqu/TzKcDw2fPuayhep/0SxBHMf40ZL1p+PowcfkUAlbhdHeqm/9TlHLjj0eYcZSE1zL71y6BkzGabbLfqP0inQob7THHaNYzCzbERmIhBR9F7SSHu7E=----ATTACHMENT:----MTg2ODQyMDQ0NjQyNTUxNCAyNDk0NzAyMDI0NDgxMzY0IDU4MzY2MDk1NTI5NjUzNzk=