Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php
Строк: 391
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentSecurityHttpFirewall;

use 
SymfonyComponentEventDispatcherEventDispatcherInterface;
use 
SymfonyComponentFormExtensionCsrfCsrfProviderCsrfProviderAdapter;
use 
SymfonyComponentFormExtensionCsrfCsrfProviderCsrfProviderInterface;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentSecurityCoreExceptionInvalidArgumentException;
use 
SymfonyComponentSecurityCoreExceptionInvalidCsrfTokenException;
use 
SymfonyComponentSecurityCsrfCsrfToken;
use 
SymfonyComponentSecurityCsrfCsrfTokenManagerInterface;
use 
SymfonyComponentSecurityHttpAuthenticationAuthenticationFailureHandlerInterface;
use 
SymfonyComponentSecurityHttpAuthenticationAuthenticationSuccessHandlerInterface;
use 
SymfonyComponentSecurityCoreAuthenticationAuthenticationManagerInterface;
use 
SymfonyComponentSecurityCoreAuthenticationSimpleFormAuthenticatorInterface;
use 
SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;
use 
SymfonyComponentSecurityCoreSecurity;
use 
SymfonyComponentSecurityHttpHttpUtils;
use 
SymfonyComponentSecurityHttpSessionSessionAuthenticationStrategyInterface;
use 
PsrLogLoggerInterface;

/**
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class SimpleFormAuthenticationListener extends AbstractAuthenticationListener
{
    private 
$simpleAuthenticator;
    private 
$csrfTokenManager;

    
/**
     * Constructor.
     *
     * @param TokenStorageInterface                  $tokenStorage          A TokenStorageInterface instance
     * @param AuthenticationManagerInterface         $authenticationManager An AuthenticationManagerInterface instance
     * @param SessionAuthenticationStrategyInterface $sessionStrategy
     * @param HttpUtils                              $httpUtils             An HttpUtilsInterface instance
     * @param string                                 $providerKey
     * @param AuthenticationSuccessHandlerInterface  $successHandler
     * @param AuthenticationFailureHandlerInterface  $failureHandler
     * @param array                                  $options               An array of options for the processing of a
     *                                                                      successful, or failed authentication attempt
     * @param LoggerInterface                        $logger                A LoggerInterface instance
     * @param EventDispatcherInterface               $dispatcher            An EventDispatcherInterface instance
     * @param CsrfTokenManagerInterface              $csrfTokenManager      A CsrfTokenManagerInterface instance
     * @param SimpleFormAuthenticatorInterface       $simpleAuthenticator   A SimpleFormAuthenticatorInterface instance
     *
     * @throws InvalidArgumentException In case no simple authenticator is provided
     * @throws InvalidArgumentException  In case an invalid CSRF token manager is passed
     */
    
public function __construct(TokenStorageInterface $tokenStorageAuthenticationManagerInterface $authenticationManagerSessionAuthenticationStrategyInterface $sessionStrategyHttpUtils $httpUtils$providerKeyAuthenticationSuccessHandlerInterface $successHandlerAuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger nullEventDispatcherInterface $dispatcher null$csrfTokenManager nullSimpleFormAuthenticatorInterface $simpleAuthenticator null)
    {
        if (!
$simpleAuthenticator) {
            throw new 
InvalidArgumentException('Missing simple authenticator');
        }

        if (
$csrfTokenManager instanceof CsrfProviderInterface) {
            
$csrfTokenManager = new CsrfProviderAdapter($csrfTokenManager);
        } elseif (
null !== $csrfTokenManager && !$csrfTokenManager instanceof CsrfTokenManagerInterface) {
            throw new 
InvalidArgumentException('The CSRF token manager should be an instance of CsrfProviderInterface or CsrfTokenManagerInterface.');
        }

        
$this->simpleAuthenticator $simpleAuthenticator;
        
$this->csrfTokenManager $csrfTokenManager;

        
$options array_merge(array(
            
'username_parameter' => '_username',
            
'password_parameter' => '_password',
            
'csrf_parameter' => '_csrf_token',
            
'intention' => 'authenticate',
            
'post_only' => true,
        ), 
$options);

        
parent::__construct($tokenStorage$authenticationManager$sessionStrategy$httpUtils$providerKey$successHandler$failureHandler$options$logger$dispatcher);
    }

    
/**
     * {@inheritdoc}
     */
    
protected function requiresAuthentication(Request $request)
    {
        if (
$this->options['post_only'] && !$request->isMethod('POST')) {
            return 
false;
        }

        return 
parent::requiresAuthentication($request);
    }

    
/**
     * {@inheritdoc}
     */
    
protected function attemptAuthentication(Request $request)
    {
        if (
null !== $this->csrfTokenManager) {
            
$csrfToken $request->get($this->options['csrf_parameter'], nulltrue);

            if (
false === $this->csrfTokenManager->isTokenValid(new CsrfToken($this->options['intention'], $csrfToken))) {
                throw new 
InvalidCsrfTokenException('Invalid CSRF token.');
            }
        }

        if (
$this->options['post_only']) {
            
$username trim($request->request->get($this->options['username_parameter'], nulltrue));
            
$password $request->request->get($this->options['password_parameter'], nulltrue);
        } else {
            
$username trim($request->get($this->options['username_parameter'], nulltrue));
            
$password $request->get($this->options['password_parameter'], nulltrue);
        }

        
$request->getSession()->set(Security::LAST_USERNAME$username);

        
$token $this->simpleAuthenticator->createToken($request$username$password$this->providerKey);

        return 
$this->authenticationManager->authenticate($token);
    }
}
Онлайн: 0
Реклама