如何为symfony2创建自定义User-Provider



我是symfony和php5的新手(我是Java, Spring, Grails开发人员)。

我正在做一个项目,它有一个java中间件和一个php前端与symfony 2。java中间件存储用户和我的应用程序所需的一切。

我不希望symfony2有它自己的数据库。symfony2所需的所有信息都来自java中间件,通过WSDL和我的php-soap-api,我可以将其包含到我的symfony2项目中。

用户需要在前端登录。所以我必须编写登录和注销功能。java-中间件提供了一个登录方法,我可以通过php-soap-api在php中调用该方法。

如何在symfony2中实现登录/注销功能?我应该实现一个调用php-soap-api的自定义User-provider吗?如果是,我该怎么做?(http://symfony.com/doc/2.0/cookbook/security/custom_provider.html)不可用

看一下用户提供程序接口文档…我认为一种方法是构建您自己的接口实现,它将充当WSDL调用的包装器,然后正确设置您的安全上下文(security.yml)来使用它。

我有一个类似的问题,我正试图建立自己的用户提供程序,以及

是的,你需要创建自己的用户提供程序,并将其作为服务添加到你的Symfony应用程序中。你创建的用户提供程序类必须实现UserProviderInterface

要开始你的类,这里有一个我的自定义类的例子,位于Namespace/Bundle/Security/Provider.php:

namespace CBWebsiteBundleSecurity;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityCoreExceptionUsernameNotFoundException;
use CBWebsiteBundleEntityUser;
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 === 'MCWebsiteBundleEntityUser';
    }
}

在这个类中需要注意的一些关键事情是,它使用了一个自定义的User实体,您可以自己定义它,这将有助于连接到Java中间件。在我的例子中,我连接到一个REST api来获取我的用户信息,我的用户类使用user::find($criteria)静态函数来通过用户名查找用户。

一旦你有了自己的User类来与中间件交互,并且你有了新的提供者,你就需要在你的bundle配置中将这个提供者作为服务添加到你的bundle配置中:

<parameters>
    <parameter key="cb_security_user.class">CBWebsiteBundleEntityUser</parameter>
    <parameter key="cb_security_provider.class">CBWebsiteBundleSecurityProvider</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>

你可以在我的博客文章中找到更多细节:在Symfony2中自定义用户提供者

希望这对你有帮助!

最新更新