-->

find user by username from multiple providers [sym

2019-09-05 11:09发布

问题:

I need to find a user object in symfony2 based on the username or emailadres. This is not for loggin in, but for other actions on a user.

I can simply request the (Doctrine2) repository and call the method loadByUsername from the UserProviderInterface that is on my repository-class.

But the code that needs to do this will be used in multiple projects and I need it to be a bit more generic. The user class/table might be different or the users might come from a completely different type of provider.

Is there a way to find a user by username just like Symfony2 itself uses when logging in? This way it will work no matter how the user providers are configured in security.yml.

Is there some service in Symfony2 I can use for this? Is there a "user provider service" where I can call a method something like "loadUserByUsername" that will try each configured provider?

回答1:

After some poking into the SecurityBundle of Symfony itself, I figured out the following:

Given this is in your security.yml:

providers:
    AdministrationUser:
        entity:
            class: AdministrationBundle\Entity\User

Symfony will create a service with the following name:

security.user.provider.concrete.administrationuser

This service uses the UserProviderInterface and when you fetch this service you can simply call the method loadUserByName and find your user.

So all you need to know is the name of the provider you configured yourself and you can determine the service-name and fetch it.


I'm in a more generic situation, so I added an alias to that service in the Extension-class of my bundle:

    // alias the user_provider mentioned
    $container->setAlias('my_security_bundle.user.provider', new Alias('security.user.provider.concrete.' . strtolower($config['user']['provider'])));

Where $config['user']['provider'] comes from config.yml (and needs to be configured in your Configuration class, but that is a different story.

Now I can simply use that new alias and I will get the correct service to find my user in a Controller like so:

    /** @var UserProviderInterface $userProvider */
    $userProvider = $this->get('my_security_bundle.user.provider');
    $user = $userProvider->loadUserByUsername('someone@somewhere.tld');


回答2:

If i understand your question.

see it http://symfony.com/doc/current/cookbook/security/multiple_user_providers.html