Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

merged branch Abhoryo/patch-1 (PR #1956)

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...
commit faa9ecf147952d035e6f3c41805100bca503e2b3 2 parents 86683aa + 621bf9b
@fabpot fabpot authored
Showing with 11 additions and 2 deletions.
  1. +11 −2 Core/User/ChainUserProvider.php
View
13 Core/User/ChainUserProvider.php
@@ -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)));
+ }
}
/**
Please sign in to comment.
Something went wrong with that request. Please try again.