简体   繁体   中英

How to create a custom User-Provider for symfony2?

I'm new to symfony and php5 (I'm Java, Spring, Grails developer).

I'm working on a project which has a java-middleware and a php frontend with symfony 2. The java middleware stores the users and everything my application needs.

I don't want symfony2 to have it's own database. All of the information symfony2 needs comes from the java-middleware via WSDL and my php-soap-api that I can include into my symfony2 project.

The users need to login in the frontend. So I have to write login and logout functionality. The java-middleware supplys a login method that I can call in php over the php-soap-api.

How should I implement the login/logout functionality in symfony2? Should I implement a custom User-provider which calls the php-soap-api? If yes, how can I do this? ( http://symfony.com/doc/2.0/cookbook/security/custom_provider.html ) isn't available.

Have a look at the User Provider Interface documentation...I think one way is build your own implementation of the interface, which will act as a wrapper for WSDL calls, and then properly setup your security context ( security.yml ) to use it.

I've got a similar problem, and I'm trying to build my own User Provider as well.

Yes, you will need create your own user provider and add it as a service your Symfony app. The user provider class you create must implement the UserProviderInterface

To get your class started here is an example of my custom class located in Namespace/Bundle/Security/Provider.php:

namespace CB\WebsiteBundle\Security;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;

use CB\WebsiteBundle\Entity\User;

class Provider implements UserProviderInterface {

    protected $user;
    public function __contsruct (UserInterface $user) {
        $this->user = $user;
    }

    /**
     * Loads the user for the given username.
     *
     * This method must throw UsernameNotFoundException if the user is not
     * found.
     *
     * @throws UsernameNotFoundException if the user is not found
     * @param string $username The username
     *
     * @return UserInterface
     */
    function loadUserByUsername($username) {
        $user = User::find(array('username'=>$username));
        if(empty($user)){
            throw new UsernameNotFoundException('Could not find user. Sorry!');
        }
        $this->user = $user;
        return $user;
    }

    /**
     * Refreshes the user for the account interface.
     *
     * It is up to the implementation if it decides to reload the user data
     * from the database, or if it simply merges the passed User into the
     * identity map of an entity manager.
     *
     * @throws UnsupportedUserException if the account is not supported
     * @param UserInterface $user
     *
     * @return UserInterface
     */
    function refreshUser(UserInterface $user) {
        return $user;
    }

    /**
     * Whether this provider supports the given user class
     *
     * @param string $class
     *
     * @return Boolean
     */
    function supportsClass($class) {
        return $class === 'MC\WebsiteBundle\Entity\User';
    }
}

Some key things to note in this class is that it uses a custom User entity that you would define yourself which would facilitate the connection to your Java middleware. In my case, I am connecting to a REST api to get my user information and my user class uses the User::find($criteria) static function to find users by username.

Once you have your own User class that interacts with your middleware, and you have your new provider, you need to add the provider as a service in your bundle configuration: YourBundle/Resources/config.xml:

<parameters>
    <parameter key="cb_security_user.class">CB\WebsiteBundle\Entity\User</parameter>
    <parameter key="cb_security_provider.class">CB\WebsiteBundle\Security\Provider</parameter>
</parameters>

<services>
    <service id="cb_security_user" class="%cb_security_user.class%" />
    <service id="cb_security_provider" class="%cb_security_provider.class%">
        <argument type="service" id="cb_security_user" />
    </service>
</services>

You can find more details on my blog post here: Custom User Providers in Symfony2

Hope this helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM