summaryrefslogtreecommitdiffstats
path: root/Http
diff options
context:
space:
mode:
Diffstat (limited to 'Http')
-rw-r--r--Http/Authentication/DefaultAuthenticationSuccessHandler.php7
-rw-r--r--Http/Firewall/ExceptionListener.php5
-rw-r--r--Http/README.md15
-rw-r--r--Http/Tests/Util/TargetPathTraitTest.php76
-rw-r--r--Http/Util/TargetPathTrait.php58
-rw-r--r--Http/composer.json2
6 files changed, 159 insertions, 4 deletions
diff --git a/Http/Authentication/DefaultAuthenticationSuccessHandler.php b/Http/Authentication/DefaultAuthenticationSuccessHandler.php
index 078a366..38690c7 100644
--- a/Http/Authentication/DefaultAuthenticationSuccessHandler.php
+++ b/Http/Authentication/DefaultAuthenticationSuccessHandler.php
@@ -13,6 +13,7 @@ namespace Symfony\Component\Security\Http\Authentication;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Security\Http\Util\TargetPathTrait;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\Security\Http\ParameterBagUtils;
@@ -25,6 +26,8 @@ use Symfony\Component\Security\Http\ParameterBagUtils;
*/
class DefaultAuthenticationSuccessHandler implements AuthenticationSuccessHandlerInterface
{
+ use TargetPathTrait;
+
protected $httpUtils;
protected $options;
protected $providerKey;
@@ -113,8 +116,8 @@ class DefaultAuthenticationSuccessHandler implements AuthenticationSuccessHandle
return $targetUrl;
}
- if (null !== $this->providerKey && $targetUrl = $request->getSession()->get('_security.'.$this->providerKey.'.target_path')) {
- $request->getSession()->remove('_security.'.$this->providerKey.'.target_path');
+ if (null !== $this->providerKey && $targetUrl = $this->getTargetPath($request->getSession(), $this->providerKey)) {
+ $this->removeTargetPath($request->getSession(), $this->providerKey);
return $targetUrl;
}
diff --git a/Http/Firewall/ExceptionListener.php b/Http/Firewall/ExceptionListener.php
index a1cae2a..2804d0e 100644
--- a/Http/Firewall/ExceptionListener.php
+++ b/Http/Firewall/ExceptionListener.php
@@ -22,6 +22,7 @@ use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException;
use Symfony\Component\Security\Core\Exception\LogoutException;
+use Symfony\Component\Security\Http\Util\TargetPathTrait;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\HttpFoundation\Request;
use Psr\Log\LoggerInterface;
@@ -39,6 +40,8 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
*/
class ExceptionListener
{
+ use TargetPathTrait;
+
private $tokenStorage;
private $providerKey;
private $accessDeniedHandler;
@@ -210,7 +213,7 @@ class ExceptionListener
{
// session isn't required when using HTTP basic authentication mechanism for example
if ($request->hasSession() && $request->isMethodSafe() && !$request->isXmlHttpRequest()) {
- $request->getSession()->set('_security.'.$this->providerKey.'.target_path', $request->getUri());
+ $this->saveTargetPath($request->getSession(), $this->providerKey, $request->getUri());
}
}
}
diff --git a/Http/README.md b/Http/README.md
index 5be2111..aaacc14 100644
--- a/Http/README.md
+++ b/Http/README.md
@@ -9,8 +9,23 @@ the Java Spring framework.
Resources
---------
+<<<<<<< HEAD
+Documentation:
+
+https://symfony.com/doc/3.1/book/security.html
+
+Tests
+-----
+
+You can run the unit tests with the following command:
+
+ $ cd path/to/Symfony/Component/Security/Http/
+ $ composer.phar install --dev
+ $ phpunit
+=======
* [Documentation](https://symfony.com/doc/current/components/security/index.html)
* [Contributing](https://symfony.com/doc/current/contributing/index.html)
* [Report issues](https://github.com/symfony/symfony/issues) and
[send Pull Requests](https://github.com/symfony/symfony/pulls)
in the [main Symfony repository](https://github.com/symfony/symfony)
+>>>>>>> 3.0
diff --git a/Http/Tests/Util/TargetPathTraitTest.php b/Http/Tests/Util/TargetPathTraitTest.php
new file mode 100644
index 0000000..b2c4dc7
--- /dev/null
+++ b/Http/Tests/Util/TargetPathTraitTest.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Symfony\Component\Security\Http\Tests\Util;
+
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+use Symfony\Component\Security\Http\Util\TargetPathTrait;
+
+class TargetPathTraitTest extends \PHPUnit_Framework_TestCase
+{
+ public function testSetTargetPath()
+ {
+ $obj = new TestClassWithTargetPathTrait();
+
+ $session = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\SessionInterface')
+ ->getMock();
+
+ $session->expects($this->once())
+ ->method('set')
+ ->with('_security.firewall_name.target_path', '/foo');
+
+ $obj->doSetTargetPath($session, 'firewall_name', '/foo');
+ }
+
+ public function testGetTargetPath()
+ {
+ $obj = new TestClassWithTargetPathTrait();
+
+ $session = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\SessionInterface')
+ ->getMock();
+
+ $session->expects($this->once())
+ ->method('get')
+ ->with('_security.cool_firewall.target_path')
+ ->willReturn('/bar');
+
+ $actualUri = $obj->doGetTargetPath($session, 'cool_firewall');
+ $this->assertEquals(
+ '/bar',
+ $actualUri
+ );
+ }
+
+ public function testRemoveTargetPath()
+ {
+ $obj = new TestClassWithTargetPathTrait();
+
+ $session = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\SessionInterface')
+ ->getMock();
+
+ $session->expects($this->once())
+ ->method('remove')
+ ->with('_security.best_firewall.target_path');
+
+ $obj->doRemoveTargetPath($session, 'best_firewall');
+ }
+}
+
+class TestClassWithTargetPathTrait
+{
+ use TargetPathTrait;
+
+ public function doSetTargetPath(SessionInterface $session, $providerKey, $uri)
+ {
+ $this->saveTargetPath($session, $providerKey, $uri);
+ }
+
+ public function doGetTargetPath(SessionInterface $session, $providerKey)
+ {
+ return $this->getTargetPath($session, $providerKey);
+ }
+
+ public function doRemoveTargetPath(SessionInterface $session, $providerKey)
+ {
+ $this->removeTargetPath($session, $providerKey);
+ }
+}
diff --git a/Http/Util/TargetPathTrait.php b/Http/Util/TargetPathTrait.php
new file mode 100644
index 0000000..986adb0
--- /dev/null
+++ b/Http/Util/TargetPathTrait.php
@@ -0,0 +1,58 @@
+<?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 Symfony\Component\Security\Http\Util;
+
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+
+/**
+ * Trait to get (and set) the URL the user last visited before being forced to authenticate.
+ */
+trait TargetPathTrait
+{
+ /**
+ * Sets the target path the user should be redirected to after authentication.
+ *
+ * Usually, you do not need to set this directly.
+ *
+ * @param SessionInterface $session
+ * @param string $providerKey The name of your firewall
+ * @param string $uri The URI to set as the target path
+ */
+ private function saveTargetPath(SessionInterface $session, $providerKey, $uri)
+ {
+ $session->set('_security.'.$providerKey.'.target_path', $uri);
+ }
+
+ /**
+ * Returns the URL (if any) the user visited that forced them to login.
+ *
+ * @param SessionInterface $session
+ * @param string $providerKey The name of your firewall
+ *
+ * @return string
+ */
+ private function getTargetPath(SessionInterface $session, $providerKey)
+ {
+ return $session->get('_security.'.$providerKey.'.target_path');
+ }
+
+ /**
+ * Removes the target path from the session.
+ *
+ * @param SessionInterface $session
+ * @param string $providerKey The name of your firewall
+ */
+ private function removeTargetPath(SessionInterface $session, $providerKey)
+ {
+ $session->remove('_security.'.$providerKey.'.target_path');
+ }
+}
diff --git a/Http/composer.json b/Http/composer.json
index a3e008a..f19d0e4 100644
--- a/Http/composer.json
+++ b/Http/composer.json
@@ -43,7 +43,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "3.1-dev"
}
}
}