Skip to content

Commit

Permalink
[Security] allowed class names to be passed as an argument to Encoder…
Browse files Browse the repository at this point in the history
…FactoryInterface::getEncoder()
  • Loading branch information
fabpot committed Jun 18, 2012
1 parent b27d9b5 commit 0b8b76b
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 6 deletions.
1 change: 1 addition & 0 deletions src/Symfony/Component/Security/CHANGELOG.md
Expand Up @@ -4,6 +4,7 @@ CHANGELOG
2.1.0
-----

* EncoderFactoryInterface::getEncoder() can now also take a class name as an argument
* allow switching to the user that is already impersonated
* added support for the remember_me parameter in the query
* added AccessMapInterface
Expand Down
Expand Up @@ -30,10 +30,10 @@ public function __construct(array $encoders)
/**
* {@inheritDoc}
*/
public function getEncoder(UserInterface $user)
public function getEncoder($user)
{
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;
}

Expand All @@ -44,7 +44,7 @@ public function getEncoder(UserInterface $user)
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));
}

/**
Expand Down
Expand Up @@ -23,9 +23,11 @@ interface EncoderFactoryInterface
/**
* 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);
}
Expand Up @@ -13,6 +13,7 @@

use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use Symfony\Component\Security\Core\Encoder\EncoderFactory;
use Symfony\Component\Security\Core\User\User;

class EncoderFactoryTest extends \PHPUnit_Framework_TestCase
{
Expand All @@ -37,7 +38,25 @@ public function testGetEncoderWithService()

$encoder = $factory->getEncoder($this->getMock('Symfony\Component\Security\Core\User\UserInterface'));
$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', ''));
}
}

1 comment on commit 0b8b76b

@stof
Copy link
Member

@stof stof commented on 0b8b76b Jun 18, 2012

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.