2011-08-03 118 views
1

我是symfony和php5的新手(我是Java,Spring,Grails開發人員)。如何爲symfony2創建自定義用戶提供程序?

我正在開發一個項目,它有一個java-middleware和一個symfony 2的php前端。 java中間件存儲用戶和我的應用程序需要的所有東西。

我不希望symfony2擁有自己的數據庫。每個symfony2需要的信息都來自java-middleware通過WSDL和我的php-soap-api,我可以將其包含到我的symfony2項目中。

用戶需要在前端登錄。所以我必須編寫登錄和註銷功能。 java-middleware提供了一個登錄方法,我可以通過php-soap-api在php中調用。

我應該如何在symfony2中實現登錄/註銷功能?我是否應該實現一個自定義的用戶提供商這個php-soap-api?如果是的話,我該怎麼做? (http://symfony.com/doc/2.0/cookbook/security/custom_provider.html)不可用。

感謝支持! whitenexx

+0

好奇你爲什麼選擇一個爲期6天的,稀疏記錄的重大項目框架? –

回答

1

看一看在User Provider Interface文檔......我想一個辦法就是建立自己的實現接口,這將作爲WSDL調用的封裝,然後正確設置你的安全上下文(安全。 yml)來使用它。

我有類似的問題,我也想建立自己的用戶提供者。

+0

在這裏你可以找到一個簡單的[代碼模板](http://tracehello.wordpress.com/2011/05/08/symfony2-custom-userprovider/) – csparpa

1

是的,您需要創建自己的用戶提供程序並將其作爲服務添加到Symfony應用程序中。創建必須實現UserProviderInterface

爲了讓您的類開始這裏的用戶提供程序類是位於命名空間/包/安全/ 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 :: find($ criteria)靜態函數通過用戶名查找用戶。

一旦你有你自己的用戶類,它與你的中間件交互,你有你的新的供應商,你需要添加提供程序作爲服務組合中的配置:YourBundle /資源/ 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

希望這有助於!

+0

我跑過這個答案,因爲它被標記爲可能不合適。克林特通常不認爲適合鏈接到內容(尤其是您自己的內容),而無需進一步闡明信息。你應該刪除這個答案(和確切的副本發佈[這裏](http://stackoverflow.com/questions/8577529/symfony-2-custom-user-provider/8593824#8593824))或在這裏總結你的解決方案。 –

+0

謝謝你通知我。我想我以前是這麼做的。我會通過我的答案,並確保刪除僅鏈接的內容。 – Clint

+0

@michael - 我編輯了我的答案,這有幫助嗎? – Clint

相關問題