3

我尝试在 Symfony 2 中创建一个自定义身份验证提供程序,只是为了好玩。我关注这个文档http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

我在这里做什么:

安全.yml

providers:
facebook_provider:
        id: facebook.security.provider 
firewalls:
admin_area:
        pattern:    ^/
        facebook:
            check_path: /login_check
            default_target_path: /
            provider: facebook_provider

我使用命名空间 Kmelkez\AuthBundle 创建了一个包

在命名空间 Kmelkez\AuthBundle\Security 中,我创建了我的自定义文件 FacebookFactory、FacebookListener、FacebookProvider、FacebookToken。

我将它们加载到我的 services.yml 文件中

服务.yml

 services:
     facebook.security.provider:
     class:  Kmelkez\AuthBundle\Security\FacebookProvider

 abstract_listener:
     abstract: true
     class: Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener

 facebook.security.listener:
     class:  Kmelkez\AuthBundle\Security\FacebookListener
     parent: abstract_listener 

最后,在我的工厂自定义类中,现在我保持简单,并像这样调用侦听器和提供者:

工厂类

  class FacebookFactory extends AbstractFactory
  {
   protected function createAuthProvider(ContainerBuilder $container, $id, $config,  $userProviderId)
    {
      $providerID = 'facebook.security.provider' . $id;      
      return $providerID;
    }

   protected function getListenerId()
   {
    return 'facebook.security.listener';
   }

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

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

当我去 /login_check 路线时,我有一个例外:

OutOfBoundsException: The index "4" is not in the range [0, -1].

还有有用的堆栈跟踪:

在 Symfony\Component\DependencyInjection\Definition.php 第 255 行的 Definition->replaceArgument('4', 'admin_area') 在 Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass.php 第 127 行的 ResolveDefinitionTemplatesPass>resolveDefinition('facebook.security.在 Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass.php 第 50 行中的 listener.admin_area', object(DefinitionDecorator))

有任何想法吗 ?

谢谢

4

1 回答 1

4

最后,我发现了问题:

我的听众扩展了一个抽象类: AbstractAuthenticationListener

所以,我编辑 services.yml 有这样的东西:

facebook.security.listener:
class:  Kmelkez\AuthBundle\Security\FacebookListener
parent: security.authentication.listener.abstract #this key is defined in security_listeners.xml
abstract: true
于 2013-06-17T02:58:05.417 回答