summaryrefslogtreecommitdiffstats
path: root/Http
diff options
context:
space:
mode:
authorFabien Potencier <fabien.potencier@gmail.com>2013-07-20 09:42:02 +0200
committerFabien Potencier <fabien.potencier@gmail.com>2013-07-20 09:42:02 +0200
commitfe2f6100bba95f9bc77ab93bfc0dcda064cfa780 (patch)
tree01eeb1225d199d24a065573ea6d1aa41bb5da3cb /Http
parentc8fe51a2773aade162b8dbe634a185f9b92d875d (diff)
parent73f4ea78eb4af288880ea99482f2542fa04b6c64 (diff)
downloadsymfony-security-fe2f6100bba95f9bc77ab93bfc0dcda064cfa780.zip
symfony-security-fe2f6100bba95f9bc77ab93bfc0dcda064cfa780.tar.gz
symfony-security-fe2f6100bba95f9bc77ab93bfc0dcda064cfa780.tar.bz2
Merge branch '2.2' into 2.3
* 2.2: [PropertyAccess] added moves to pluralMap [Security] fixed issue where authentication listeners clear unrelated tokens fix issue #8499 modelChoiceList call getPrimaryKey on a non object [DependencyInjection] Add exception for service name not dumpable in PHP Conflicts: src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php src/Symfony/Component/Security/Tests/Http/Firewall/BasicAuthenticationListenerTest.php
Diffstat (limited to 'Http')
-rw-r--r--Http/Firewall/AbstractAuthenticationListener.php5
-rw-r--r--Http/Firewall/AbstractPreAuthenticatedListener.php19
-rw-r--r--Http/Firewall/BasicAuthenticationListener.php5
-rw-r--r--Http/Firewall/DigestAuthenticationListener.php5
4 files changed, 30 insertions, 4 deletions
diff --git a/Http/Firewall/AbstractAuthenticationListener.php b/Http/Firewall/AbstractAuthenticationListener.php
index 4e71e99..92618e5 100644
--- a/Http/Firewall/AbstractAuthenticationListener.php
+++ b/Http/Firewall/AbstractAuthenticationListener.php
@@ -194,7 +194,10 @@ abstract class AbstractAuthenticationListener implements ListenerInterface
$this->logger->info(sprintf('Authentication request failed: %s', $failed->getMessage()));
}
- $this->securityContext->setToken(null);
+ $token = $this->securityContext->getToken();
+ if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) {
+ $this->securityContext->setToken(null);
+ }
$response = $this->failureHandler->onAuthenticationFailure($request, $failed);
diff --git a/Http/Firewall/AbstractPreAuthenticatedListener.php b/Http/Firewall/AbstractPreAuthenticatedListener.php
index c6e47d0..28f6411 100644
--- a/Http/Firewall/AbstractPreAuthenticatedListener.php
+++ b/Http/Firewall/AbstractPreAuthenticatedListener.php
@@ -21,6 +21,7 @@ use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\Security\Core\Exception\BadCredentialsException;
/**
* AbstractPreAuthenticatedListener is the base class for all listener that
@@ -59,7 +60,12 @@ abstract class AbstractPreAuthenticatedListener implements ListenerInterface
$this->logger->debug(sprintf('Checking secure context token: %s', $this->securityContext->getToken()));
}
- list($user, $credentials) = $this->getPreAuthenticatedData($request);
+ try {
+ list($user, $credentials) = $this->getPreAuthenticatedData($request);
+ } catch (BadCredentialsException $exception) {
+ $this->clearToken();
+ return;
+ }
if (null !== $token = $this->securityContext->getToken()) {
if ($token instanceof PreAuthenticatedToken && $this->providerKey == $token->getProviderKey() && $token->isAuthenticated() && $token->getUsername() === $user) {
@@ -84,6 +90,17 @@ abstract class AbstractPreAuthenticatedListener implements ListenerInterface
$this->dispatcher->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $loginEvent);
}
} catch (AuthenticationException $failed) {
+ $this->clearToken();
+ }
+ }
+
+ /**
+ * Clears a PreAuthenticatedToken for this provider (if present)
+ */
+ protected function clearToken()
+ {
+ $token = $this->securityContext->getToken();
+ if ($token instanceof PreAuthenticatedToken && $this->providerKey === $token->getProviderKey()) {
$this->securityContext->setToken(null);
if (null !== $this->logger) {
diff --git a/Http/Firewall/BasicAuthenticationListener.php b/Http/Firewall/BasicAuthenticationListener.php
index 5b1c8b3..bfc4abc 100644
--- a/Http/Firewall/BasicAuthenticationListener.php
+++ b/Http/Firewall/BasicAuthenticationListener.php
@@ -74,7 +74,10 @@ class BasicAuthenticationListener implements ListenerInterface
$token = $this->authenticationManager->authenticate(new UsernamePasswordToken($username, $request->headers->get('PHP_AUTH_PW'), $this->providerKey));
$this->securityContext->setToken($token);
} catch (AuthenticationException $failed) {
- $this->securityContext->setToken(null);
+ $token = $this->securityContext->getToken();
+ if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) {
+ $this->securityContext->setToken(null);
+ }
if (null !== $this->logger) {
$this->logger->info(sprintf('Authentication request failed for user "%s": %s', $username, $failed->getMessage()));
diff --git a/Http/Firewall/DigestAuthenticationListener.php b/Http/Firewall/DigestAuthenticationListener.php
index 7ab3dcf..ea85e77 100644
--- a/Http/Firewall/DigestAuthenticationListener.php
+++ b/Http/Firewall/DigestAuthenticationListener.php
@@ -124,7 +124,10 @@ class DigestAuthenticationListener implements ListenerInterface
private function fail(GetResponseEvent $event, Request $request, AuthenticationException $authException)
{
- $this->securityContext->setToken(null);
+ $token = $this->securityContext->getToken();
+ if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) {
+ $this->securityContext->setToken(null);
+ }
if (null !== $this->logger) {
$this->logger->info($authException);