我是symfony和php5的新手(我是Java,Spring,Grails开发人员)。
我正在做一个项目,它有一个java中间件和一个使用symfony 2的php前端。java中间件存储用户和我的应用程序所需的一切。
我不希望symfony2有自己的数据库。symfony2需要的所有信息都是通过WSDL和我的php-soap-api从java中间件获得的,我可以将它们包含到我的symfony2项目中。
用户需要在前台登录。因此,我必须编写登录和注销功能。java中间件提供了一个登录方法,我可以在php中通过php-soap-api调用该方法。
如何在symfony2中实现登录/注销功能?我应该实现一个调用php-soap-api的自定义用户提供程序吗?如果是,我该怎么做?( http://symfony.com/doc/2.0/cookbook/security/custom_provider.html )不可用。
发布于 2011-08-05 08:01:38
我认为一种方法是构建您自己的接口实现,它将充当User Provider Interface调用的包装器,然后正确设置您的安全上下文(security.yml)以使用它。
我也遇到了类似的问题,我也在尝试构建自己的用户提供商。
发布于 2011-12-21 17:27:27
是的,您需要创建自己的用户提供商,并将其添加为您的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中间件。在我的例子中,我连接到REST api来获取我的用户信息,我的user类使用User:: find ($criteria)静态函数通过用户名查找用户。
一旦您有了自己的与中间件交互的用户类,并且有了新的提供者,您需要将该提供者作为服务添加到捆绑包配置中: 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>
你可以在我的博客文章中找到更多详细信息:Custom User Providers in Symfony2
希望这能有所帮助!
https://stackoverflow.com/questions/6925663
复制