+ */
+final class SecurityUserValueResolver implements ArgumentValueResolverInterface
+{
+ private $tokenStorage;
+
+ public function __construct(TokenStorageInterface $tokenStorage)
+ {
+ $this->tokenStorage = $tokenStorage;
+ }
+
+ public function supports(Request $request, ArgumentMetadata $argument)
+ {
+ // only security user implementations are supported
+ if (UserInterface::class !== $argument->getType()) {
+ return false;
+ }
+
+ $token = $this->tokenStorage->getToken();
+ if (!$token instanceof TokenInterface) {
+ return false;
+ }
+
+ $user = $token->getUser();
+
+ // in case it's not an object we cannot do anything with it; E.g. "anon."
+ return $user instanceof UserInterface;
+ }
+
+ public function resolve(Request $request, ArgumentMetadata $argument)
+ {
+ yield $this->tokenStorage->getToken()->getUser();
+ }
+}
diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Controller/LoginController.php b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Controller/LoginController.php
index ad003158f5179..acc8f43255494 100644
--- a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Controller/LoginController.php
+++ b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Controller/LoginController.php
@@ -17,12 +17,13 @@
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Security;
+use Symfony\Component\Security\Core\User\UserInterface;
class LoginController implements ContainerAwareInterface
{
use ContainerAwareTrait;
- public function loginAction(Request $request)
+ public function loginAction(Request $request, UserInterface $user = null)
{
// get the login error if there is one
if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
@@ -38,9 +39,9 @@ public function loginAction(Request $request)
));
}
- public function afterLoginAction()
+ public function afterLoginAction(UserInterface $user)
{
- return $this->container->get('templating')->renderResponse('FormLoginBundle:Login:after_login.html.twig');
+ return $this->container->get('templating')->renderResponse('FormLoginBundle:Login:after_login.html.twig', array('user' => $user));
}
public function loginCheckAction()
diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Resources/views/Login/after_login.html.twig b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Resources/views/Login/after_login.html.twig
index 3ef1f9c7bd183..8f6a76098597f 100644
--- a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Resources/views/Login/after_login.html.twig
+++ b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/FormLoginBundle/Resources/views/Login/after_login.html.twig
@@ -1,7 +1,7 @@
{% extends "::base.html.twig" %}
{% block body %}
- Hello {{ app.user.username }}!
+ Hello {{ user.username }}!
You're browsing to path "{{ app.request.pathInfo }}".
Log out.
diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/SecurityUserValueResolverTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/SecurityUserValueResolverTest.php
new file mode 100644
index 0000000000000..e0d626a8cee40
--- /dev/null
+++ b/src/Symfony/Bundle/SecurityBundle/Tests/SecurityUserValueResolverTest.php
@@ -0,0 +1,100 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\SecurityBundle\Tests;
+
+use Symfony\Bundle\SecurityBundle\SecurityUserValueResolver;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
+use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
+use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
+use Symfony\Component\Security\Core\User\UserInterface;
+
+class SecurityUserValueResolverTest extends \PHPUnit_Framework_TestCase
+{
+ public function testResolveNoToken()
+ {
+ $tokenStorage = new TokenStorage();
+ $resolver = new SecurityUserValueResolver($tokenStorage);
+ $metadata = new ArgumentMetadata('foo', UserInterface::class, false, false, null);
+
+ $this->assertFalse($resolver->supports(Request::create('/'), $metadata));
+ }
+
+ public function testResolveNoUser()
+ {
+ $mock = $this->getMock(UserInterface::class);
+ $token = $this->getMock(TokenInterface::class);
+ $tokenStorage = new TokenStorage();
+ $tokenStorage->setToken($token);
+
+ $resolver = new SecurityUserValueResolver($tokenStorage);
+ $metadata = new ArgumentMetadata('foo', get_class($mock), false, false, null);
+
+ $this->assertFalse($resolver->supports(Request::create('/'), $metadata));
+ }
+
+ public function testResolveWrongType()
+ {
+ $tokenStorage = new TokenStorage();
+ $resolver = new SecurityUserValueResolver($tokenStorage);
+ $metadata = new ArgumentMetadata('foo', null, false, false, null);
+
+ $this->assertFalse($resolver->supports(Request::create('/'), $metadata));
+ }
+
+ public function testResolve()
+ {
+ $user = $this->getMock(UserInterface::class);
+ $token = $this->getMock(TokenInterface::class);
+ $token->expects($this->any())->method('getUser')->willReturn($user);
+ $tokenStorage = new TokenStorage();
+ $tokenStorage->setToken($token);
+
+ $resolver = new SecurityUserValueResolver($tokenStorage);
+ $metadata = new ArgumentMetadata('foo', UserInterface::class, false, false, null);
+
+ $this->assertTrue($resolver->supports(Request::create('/'), $metadata));
+ $this->assertSame(array($user), iterator_to_array($resolver->resolve(Request::create('/'), $metadata)));
+ }
+
+ public function testIntegration()
+ {
+ $user = $this->getMock(UserInterface::class);
+ $token = $this->getMock(TokenInterface::class);
+ $token->expects($this->any())->method('getUser')->willReturn($user);
+ $tokenStorage = new TokenStorage();
+ $tokenStorage->setToken($token);
+
+ $argumentResolver = new ArgumentResolver(null, array(new SecurityUserValueResolver($tokenStorage)));
+ $this->assertSame(array($user), $argumentResolver->getArguments(Request::create('/'), function (UserInterface $user) {}));
+ }
+
+ public function testIntegrationNoUser()
+ {
+ $token = $this->getMock(TokenInterface::class);
+ $tokenStorage = new TokenStorage();
+ $tokenStorage->setToken($token);
+
+ $argumentResolver = new ArgumentResolver(null, array(new SecurityUserValueResolver($tokenStorage), new DefaultValueResolver()));
+ $this->assertSame(array(null), $argumentResolver->getArguments(Request::create('/'), function (UserInterface $user = null) {}));
+ }
+}
+
+abstract class DummyUser implements UserInterface
+{
+}
+
+abstract class DummySubUser extends DummyUser
+{
+}
diff --git a/src/Symfony/Bundle/SecurityBundle/composer.json b/src/Symfony/Bundle/SecurityBundle/composer.json
index 40d2e047413b2..495c670e7d7b8 100644
--- a/src/Symfony/Bundle/SecurityBundle/composer.json
+++ b/src/Symfony/Bundle/SecurityBundle/composer.json
@@ -18,7 +18,7 @@
"require": {
"php": ">=5.5.9",
"symfony/security": "~3.1,>=3.1.2",
- "symfony/http-kernel": "~2.8|~3.0",
+ "symfony/http-kernel": "~3.1",
"symfony/polyfill-php70": "~1.0"
},
"require-dev": {
@@ -27,7 +27,7 @@
"symfony/css-selector": "~2.8|~3.0",
"symfony/dom-crawler": "~2.8|~3.0",
"symfony/form": "~2.8|~3.0",
- "symfony/framework-bundle": "~2.8|~3.0",
+ "symfony/framework-bundle": "~3.1",
"symfony/http-foundation": "~2.8|~3.0",
"symfony/security-acl": "~2.8|~3.0",
"symfony/twig-bundle": "~2.8|~3.0",
diff --git a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestValueResolver.php b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestValueResolver.php
index 5dabc5db401ae..2a5060a612681 100644
--- a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestValueResolver.php
+++ b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestValueResolver.php
@@ -27,7 +27,7 @@ final class RequestValueResolver implements ArgumentValueResolverInterface
*/
public function supports(Request $request, ArgumentMetadata $argument)
{
- return $argument->getType() === Request::class || is_subclass_of($argument->getType(), Request::class);
+ return Request::class === $argument->getType() || is_subclass_of($argument->getType(), Request::class);
}
/**
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy