Java 如何为symfony2创建自定义用户提供程序?

Java 如何为symfony2创建自定义用户提供程序?,java,php,soap,wsdl,symfony,Java,Php,Soap,Wsdl,Symfony,我不熟悉symfony和php5(我是Java、Spring、Grails开发人员) 我正在做一个项目,它有一个java中间件和一个带有symfony 2的php前端。 java中间件存储用户和我的应用程序所需的一切 我不希望symfony2拥有自己的数据库。symfony2需要的所有信息都来自java中间件,通过WSDL和我的php soap api,我可以将它们包含到我的symfony2项目中 用户需要在前端登录。所以我必须编写登录和注销功能。 java中间件提供了一个登录方法,我可以通过p

我不熟悉symfony和php5(我是Java、Spring、Grails开发人员)

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

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

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

我应该如何在symfony2中实现登录/注销功能?我应该实现一个调用php soap api的自定义用户提供程序吗?如果是,我怎么做?()不可用。

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


我也遇到了类似的问题,我正在尝试建立自己的用户提供商。

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

要启动您的类,这里有一个位于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';
    }
}
在这个类中需要注意的一些关键问题是,它使用了一个自定义的用户实体,您可以自己定义它,这将有助于连接到Java中间件。在我的例子中,我连接到一个RESTAPI来获取我的用户信息,我的用户类使用user::find($criteria)静态函数按用户名查找用户

一旦您拥有了与中间件交互的自己的用户类,并且拥有了新的提供程序,您需要将该提供程序作为服务添加到bundle配置中: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>

CB\WebsiteBundle\Entity\User
CB\WebsiteBundle\Security\Provider


希望这有帮助

好奇为什么你要为一个重要的项目选择一个6天的、文档稀少的框架?在这里你可以找到一个简单的答案,因为它被标记为可能不合适。克林特,通常认为在没有进一步说明的情况下链接到内容(特别是你自己的内容)是不合适的。您应该删除此答案(以及张贴的确切副本)或在此处总结您的解决方案。谢谢您通知我。我想我以前做过。我会检查我的答案,并确保删除链接内容。这太棒了,克林特。我看到在你编辑之后,自动生成的标志现在消失了。