我尝试在 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))
有任何想法吗 ?
谢谢