Skip to content

Commit

Permalink
merged branch Abhoryo/patch-1 (PR #1956)
Browse files Browse the repository at this point in the history
Commits
-------

e9d2a67 CS
3a64b08 Search in others user providers when a user is not found in the first user provider and throws the right exception.

Discussion
----------

Chain user provider doesn't search in all user providers

I commit these changes because Chain user provider doesn't search in all user providers.

Example with the Acme/DemoBundle:

    // security.yml
    ...
        providers:
            chain_provider:
                providers: [in_memory, in_memory_extend]
            in_memory_extend:
                users:
                    admin2: { password: adminpass2, roles: [ 'ROLE_ADMIN' ] }
            in_memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
    ...
        firewalls:
    ...
            secured_area:
                pattern:    ^/demo/secured/
                provider: chain_provider OR in_memory_extend
    ...

We can see these logs :

    security.INFO: User "admin2" has been authenticated successfully [] []
    security.DEBUG: Write SecurityContext in the session [] []
    security.DEBUG: Read SecurityContext from the session [] []
    security.DEBUG: Reloading user from user provider. [] []
    security.WARNING: Username "admin2" could not be found. [] []

The new code search in others user providers when a user is not found in the first user provider and throws the right exception.

---------------------------------------------------------------------------

by lsmith77 at 2011/08/14 12:20:04 -0700

I wonder if it should be a provider option to continue on a failed user lookup. I can see cases where you really dont want to iterate over all providers and others where you do.

---------------------------------------------------------------------------

by Abhoryo at 2011/08/14 17:27:16 -0700

If someone need a provider like you describe, he can create one.
Here we talk about a chain user provider.

Doc : [using-multiple-user-providers](http://symfony.com/doc/current/book/security.html#using-multiple-user-providers)

We can read in the doc: "The chain_provider will, in turn, try to load the user from both the in_memory and user_db providers."
But its not the case right now.
  • Loading branch information
fabpot committed Aug 23, 2011
2 parents 0b53193 + e9d2a67 commit 1bb53b8
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions src/Symfony/Component/Security/Core/User/ChainUserProvider.php
Expand Up @@ -52,15 +52,24 @@ public function loadUserByUsername($username)
*/
public function refreshUser(UserInterface $user)
{
$supportedUserFound = false;

foreach ($this->providers as $provider) {
try {
return $provider->refreshUser($user);
} catch (UnsupportedUserException $unsupported) {
// try next one
} catch (UsernameNotFoundException $notFound) {
$supportedUserFound = true;
// try next one
}
}

throw new UnsupportedUserException(sprintf('The account "%s" is not supported.', get_class($user)));

if ($supportedUserFound) {
throw new UsernameNotFoundException(sprintf('There is no user with name "%s".', $user->getUsername()));
} else {
throw new UnsupportedUserException(sprintf('The account "%s" is not supported.', get_class($user)));
}
}

/**
Expand Down

0 comments on commit 1bb53b8

Please sign in to comment.