カスタム認証を作成しました。しかし、理由は不明ですが、アクティブな認証リスナーが 2 つあります。したがって、認証プロバイダー マネージャーは Twice と呼ばれます。
Firstyが呼び出され、正しいトークンを返すAuthListener
mu が実行されます。AuthenticationProviderManager
次にUsernamePasswordFormAuthenticationListener
が呼び出され、AuthenticationProviderManager
再び実行されます。そして、「不正な資格情報」を返します。
どうすれば「無効」にできUsernamePasswordFormAuthenticationListener
ますか? 私のカスタムリスナーだけが呼び出されますか?
安全:
providers:
api:
id: api_user_provider
firewalls:
secured_area:
pattern: ^/
user: true
form_login:
login_path: /login
check_path: /check_login
logout: ~
サービス:
api_user_provider:
class: Ad\FrontendBundle\Security\User\UserProvider
arguments: ["@service_container"]
user.security.authentication.provider:
class: Ad\FrontendBundle\Security\Authentication\Provider\AuthProvider
arguments: ['', %kernel.cache_dir%/security/nonces]
user.security.authentication.listener:
class: Ad\FrontendBundle\Security\Firewall\AuthListener
arguments: ["@security.context", "@security.authentication.manager"]
工場
class ApiFactory implements SecurityFactoryInterface
{
public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
{
$providerId = 'security.authentication.provider.user.'.$id;
$container
->setDefinition($providerId, new DefinitionDecorator('user.security.authentication.provider'))
->replaceArgument(0, new Reference($userProvider))
;
$listenerId = 'security.authentication.listener.user.'.$id;
$listener = $container->setDefinition($listenerId, new DefinitionDecorator('user.security.authentication.listener'))
;
return array($providerId, $listenerId, $defaultEntryPoint);
}
public function getPosition()
{
return 'pre_auth';
}
public function getKey()
{
return 'user';
}
public function addConfiguration(NodeDefinition $node)
{}
}
class AdFrontendBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
$extension = $container->getExtension('security');
$extension->addSecurityListenerFactory(new ApiFactory());
}
}