[Security] allowed class names to be passed as an argument to EncoderFactoryInterface::getEncoder()

This commit is contained in:
Fabien Potencier 2012-06-18 08:12:50 +02:00
parent b27d9b541a
commit 0b8b76bfef
4 changed files with 28 additions and 6 deletions

View File

@ -4,6 +4,7 @@ CHANGELOG
2.1.0 2.1.0
----- -----
* EncoderFactoryInterface::getEncoder() can now also take a class name as an argument
* allow switching to the user that is already impersonated * allow switching to the user that is already impersonated
* added support for the remember_me parameter in the query * added support for the remember_me parameter in the query
* added AccessMapInterface * added AccessMapInterface

View File

@ -30,10 +30,10 @@ class EncoderFactory implements EncoderFactoryInterface
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function getEncoder(UserInterface $user) public function getEncoder($user)
{ {
foreach ($this->encoders as $class => $encoder) { foreach ($this->encoders as $class => $encoder) {
if (!$user instanceof $class) { if ((is_object($user) && !$user instanceof $class) || (!is_subclass_of($user, $class) && $user != $class)) {
continue; continue;
} }
@ -44,7 +44,7 @@ class EncoderFactory implements EncoderFactoryInterface
return $this->encoders[$class]; return $this->encoders[$class];
} }
throw new \RuntimeException(sprintf('No encoder has been configured for account "%s".', get_class($user))); throw new \RuntimeException(sprintf('No encoder has been configured for account "%s".', is_object($class) ? get_class($user) : $class));
} }
/** /**

View File

@ -23,9 +23,11 @@ interface EncoderFactoryInterface
/** /**
* Returns the password encoder to use for the given account. * Returns the password encoder to use for the given account.
* *
* @param UserInterface $user * @param UserInterface|string $user A UserInterface instance of a class name
* *
* @return PasswordEncoderInterface never null * @return PasswordEncoderInterface
*
* @throws \RuntimeException when no password encoder could be found for the user
*/ */
function getEncoder(UserInterface $user); function getEncoder($user);
} }

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\Security\Tests\Core\Encoder;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder; use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use Symfony\Component\Security\Core\Encoder\EncoderFactory; use Symfony\Component\Security\Core\Encoder\EncoderFactory;
use Symfony\Component\Security\Core\User\User;
class EncoderFactoryTest extends \PHPUnit_Framework_TestCase class EncoderFactoryTest extends \PHPUnit_Framework_TestCase
{ {
@ -37,7 +38,25 @@ class EncoderFactoryTest extends \PHPUnit_Framework_TestCase
$encoder = $factory->getEncoder($this->getMock('Symfony\Component\Security\Core\User\UserInterface')); $encoder = $factory->getEncoder($this->getMock('Symfony\Component\Security\Core\User\UserInterface'));
$expectedEncoder = new MessageDigestPasswordEncoder('sha1'); $expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
$encoder = $factory->getEncoder(new User('user', 'pass'));
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
}
public function testGetEncoderWithClassName()
{
$factory = new EncoderFactory(array(
'Symfony\Component\Security\Core\User\UserInterface' => new MessageDigestPasswordEncoder('sha1'),
));
$encoder = $factory->getEncoder('Symfony\Component\Security\Core\User\UserInterface');
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
$encoder = $factory->getEncoder('Symfony\Component\Security\Core\User\User');
$expectedEncoder = new MessageDigestPasswordEncoder('sha1');
$this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', '')); $this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
} }
} }