find user by username from multiple providers [symfony2]

人盡茶涼 提交于 2020-01-26 04:11:48

问题


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



来源:https://stackoverflow.com/questions/29823352/find-user-by-username-from-multiple-providers-symfony2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!