2015-03-31 75 views
0

我正在爲symfony的安全組件掙扎。我想基於第三方cookie和/或傳統的登錄表單來實現身份驗證。 稍微詳細一點: 首先,應用程序應檢查用戶是否有來自我們環境中其他應用程序的cookie。在這種情況下,如果外部api中的會話有效,應用程序將識別cookie, 將針對外部API驗證該用戶,並驗證用戶。如果它無效或用戶沒有這樣的cookie,應用程序就會將請求轉發到正常的登錄表單。 我已經嘗試了很多方法來實現這種行爲,開始自定義登錄表單身份驗證提供程序,通過自定義偵聽器等。使用第三方cookie或登錄表單進行Symfony 2.6身份驗證

目前我正在嘗試它與兩個分離的安全工廠。一個實現SecurityFactoryInterface與自定義偵聽器和提供程序,另一個使用自定義提供程序和默認偵聽器擴展FormLoginFactory。

這裏從當前狀態一些示例代碼:

CustomCookieSecurityFactory.php

class CustomCookieSecurityFactory implements SecurityFactoryInterface 
{ 
    public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint) 
    { 
    $providerId = 'security.authentication.provider.custom.cookie.'.$id; 
    $container 
     ->setDefinition($providerId, new DefinitionDecorator('security.authentication.provider.custom.cookie')) 
     ->replaceArgument(0, new Reference($userProvider)) 
    ; 

    $listenerId = 'security.authentication.listener.custom.cookie.'.$id; 
    $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.custom.cookie')); 

    return array($providerId, $listenerId, $defaultEntryPoint); 
    } 

    public function getPosition() 
    { 
    return 'pre_auth'; 
    } 

    public function getKey() { 
    return 'custom_cookie'; 
    } 
} 

CustomFormLoginSecurityFactory

class CustomFormLoginSecurityFactory extends FormLoginFactory 
{ 
    public function getKey() 
    { 
    return 'custom_form_login'; 
    } 

    /** 
    * Create custom provider. 
    * 
    */ 
    protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId) 
    { 
    $provider = 'security.authentication.provider.custom.form.'.$id; 
    $container 
    ->setDefinition($provider, new DefinitionDecorator('security.authentication.provider.custom.form')) 
    ->replaceArgument(0, new Reference($userProviderId)) 
    ->replaceArgument(2, $id) 
    ; 

    return $provider; 
    } 
} 

service.yml

security.authentication.listener.custom.cookie: 
    class: AppBundle\Security\Http\Firewall\CustomCookieAuthenticationListener 
    arguments: ["@security.token_storage", "@security.authentication.manager", "@service_container", "@logger"] 

security.authentication.provider.custom.cookie: 
    class: AppBundle\Security\Authentication\Provider\CustomCookieAuthenticationProvider 
    arguments: ["", "@logger"] 

security.authentication.provider.custom.form: 
    class: AppBundle\Security\Authentication\Provider\CustomFormLoginAuthenticationProvider 
    arguments: ["", "@security.user_checker", "", "@security.encoder_factory", true, "@logger", "@custom_router", "@doctrine.orm.entity_manager", "@request_stack"] 

security.yml

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt|error)|css|images|js)/ 
     security: false 

    secured_area: 
     anonymous: ~ 
     custom_cookie: ~ 
     custom_form_login: 
      provider: custom_user 
      login_path: /login 
      check_path: /login-check 
      username_parameter: form[username] 
      password_parameter: form[password] 
     logout: 
      path: /logout 
      target:/

我的主要問題是,如果基於Cookie的身份驗證不起作用,第二類型的身份驗證,則不會調用。也許我的方式完全錯誤,或者沒有正確配置我的防火牆。

從知道好symfony的安全組件的人那裏得到一些幫助是很好的。

回答

0

根據Symfony2 documentation可以使用simple_preauth參數到您的security.yml

# app/config/security.yml 
security: 
    # ... 

    firewalls: 
     secured_area: 
      pattern: ^/admin 
      stateless: false 
      simple_preauth: 
       authenticator: apikey_authenticator 
      provider: api_key_user_provider 

    providers: 
     api_key_user_provider: 
      id: api_key_user_provider 

您也可以chain providers