2012-06-05 65 views
0

我想在Symfony \ Component \ Security \ Core \ Authentication \ AuthenticationProviderManager的函數authenticate()中添加一些代碼。symfony2覆蓋服務security.authentication.manager

我試着創建一個安全包的子包。 而我重新定義了security.authentication.manager服務,該軟件包像

<!-- Authentication related services --> 
    <service id="security.authentication.manager" class="%security.authentication.manager.class%" public="false"> 
     <argument type="collection" /> 
    </service> 

但是,當我relad頁面,框架拋出一個異常:InvalidArgumentException:您必須至少添加一個身份驗證提供者。

我想這是因爲依賴是在父包配置中創建的。

如果不重新定義整個安全捆綁包,我必須做些什麼才能使它工作? 謝謝。

回答

0

好吧,我發現,最好的辦法就是創建自己的工廠,擴展的Symfony2的formFactory

然後我必須創建我的自己的AuthentificationProvider擴展DaoAuthenticationProvider並將其聲明爲抽象服務。

然後通過createAuthProvider()方法在工廠內創建服務並替換我們需要的參數。

protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId) 
{ 
    $provider = 'acme.authentication.provider.dao.'.$id; 
    $container 
     ->setDefinition($provider, new DefinitionDecorator('acme.authentication.provider.dao')) 
     ->replaceArgument(0, new Reference($userProviderId))//replace args on the service constructor 
     ->replaceArgument(2, $id) 
     ->addArgument(new Reference('acme.api'))//add some args to the service constructor 
    ; 

    return $provider; 
} 
0

我想,更好的將創建自己的處理程序。

  1. 您需要創建service
  2. 註冊成service container。在security.yml
  3. 只需設置處理程序:
form_login: 
    success_handler: success_login_handler 
    failure_handler: failure_login_handler 
logout: 
    success_handler: success_logout_handler 
+0

其實我需要做一些驗證。我需要調用外部API和測試證書登錄用戶之前,那麼如果用戶帳戶存在(外部API和本地數據庫)給我的授權訪問用戶。 – Rmannn

+0

如果您從本地數據庫加載用戶,您是否可以在['EntityRepository']中執行此項工作(http://symfony.com/doc/current/cookbook/security/entity_provider.html#authenticating-someone-with-a-custom -entity提供商)? – jkucharovic

+0

這是問題所在,實際上我想用登錄表單首先在api上搜索以查找用戶(不在db中),並且如果外部登錄返回用戶,它們將與數據庫同步。 因爲這個原因,我想能夠在驗證方法()中添加一些自定義測試,但我真的不知道如何正確覆蓋SecurityBundle – Rmannn