我正在爲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的安全組件的人那裏得到一些幫助是很好的。