Symfony 2.6使用第三方cookie或登录表单进行身份验证


Symfony 2.6 authentication with third party cookie or login form

我正在与symfony的安全组件作斗争。我想实现基于第三方cookie和/或传统登录表单的身份验证。再详细一点:首先,应用程序应该检查用户是否有来自我们环境中其他应用程序的cookie。在这种情况下,应用程序识别cookie,如果外部api中的会话有效,则根据外部api对其进行验证,并对用户进行身份验证。如果它无效或用户没有这样的cookie,则应用程序将请求转发到正常登录表单。我已经尝试了很多方法来实现这种行为,从自定义登录表单身份验证提供者开始,通过自定义侦听器等。

目前,我正在两家独立的安全工厂试用。其中一个实现了带有自定义侦听器和提供程序的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';
  }
}  

自定义表单登录安全工厂

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安全组件的人的帮助,那就太好了。

根据Symfony2文档,您可以在security.yml:中使用simple_preauth参数

# 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

您也可以连锁供应商。