自定义身份验证提供商中的Symfony2 contexterRorexception



我正在尝试制作一个如何创建自定义身份验证提供商,经过完整阅读并查看Symfony代码,我认为仅使用创建工厂,身份验证提供商并使用Symfony默认类是足够的,但实际上我缺少某些内容,并且我遇到了此错误

ContextErrorException: Catchable Fatal Error: Argument 1 passed to AcmeDemoBundleProviderMyProvider::__construct() must implement interface SymfonyComponentSecurityCoreUserUserProviderInterface, string given, called in D:wampwwwsf2ldapappcachedevappDevDebugProjectContainer.php on line 1383 and defined in D:wampwwwsf2ldapsrcAcmeDemoBundleProviderMyProvider.php line 20

工厂

namespace AcmeDemoBundleFactory;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentDependencyInjectionReference;
use SymfonyComponentDependencyInjectionDefinitionDecorator;
use SymfonyComponentConfigDefinitionBuilderNodeDefinition;
use SymfonyBundleSecurityBundleDependencyInjectionSecurityFactoryAbstractFactory;
class MyFactory extends AbstractFactory
{
    public function getPosition()
    {
        return 'form';
    }
    public function getKey()
    {
        return 'kstr';
    }
    protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId)
    {
        $providerId = 'security.authentication.provider.kstr.' . $id;
        $container
                ->setDefinition($providerId, new DefinitionDecorator('kstr.security.authentication.provider'))
                ->replaceArgument(0, new Reference($userProviderId));
        return $providerId;
    }
    protected function getListenerId()
    {
        return 'security.authentication.listener.form';
    }
}

我的提供商

namespace AcmeDemoBundleProvider;
use SymfonyComponentSecurityCoreAuthenticationProviderAuthenticationProviderInterface;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityCoreExceptionAuthenticationException;
use SymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;
class MyProvider implements AuthenticationProviderInterface
{
    private $_userProvider;
    public function __construct(UserProviderInterface $userProvider)
    {
        $this->_userProvider = $userProvider;
    }
    public function authenticate(TokenInterface $token)
    {
        try
        {
            $user = $this->_userProvider->loadUserByUsername($token->getUsername());
            //custom auth steps
            $token = new UsernamePasswordToken(
                    $token->getUsername(), null, $token->getProviderKey(), $user->getRoles()
            );
            return $token;
            }
        } catch (Exception $exc)
        {
            throw new AuthenticationException('Invalid username or password. ', 0, $e);
        }
        throw new AuthenticationException('Invalid username or password asdfasd');
    }
    public function supports(TokenInterface $token)
    {
        return $token instanceof UsernamePasswordToken;
    }
}

services.yml

services:
    kstr.security.authentication.provider:
        class:  AcmeDemoBundleProviderMyProvider
        arguments: [""]

security.yml

security:
    encoders:
        AcmeDemoBundleEntitySecureUser: plaintext
    providers:
        multiples:
            chain:
                providers: [entity_provider, ldap]
        entity_provider:
          entity: { class: AcmeDemoBundle:SecureUser, property: username }
        ldap:
          id: kstr.security.authentication.provider
    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login:
            pattern:  ^/demo/secured/login$
            security: false
        secured_area:
            pattern:    ^/demo/secured/
            kstr: 
                check_path: _security_check
                login_path: _demo_login
                provider: ldap
            logout:
                path:   _demo_logout
                target: _demo

需要一些帮助才能解决这个问题,我在这里缺少什么?即使默认的" security.authentication.listener.form"满足我的需求,我是否也需要创建一个自定义侦听器?

您将字符串 arguments: [""]作为服务的构造函数的第一个参数。

这就是__construct(UserProviderInterface $userProvider)中的TypeHint失败的原因。

正确注入UserProviderInterface,例外将消失。

最新更新