Zend 2 + Doctrine 2身份验证

时间:2013-03-02 14:18:37

标签: php authentication doctrine-orm zend-framework2

我想使用Doctrine 2和ZF2进行身份验证。为了获得一些帮助,我使用了Zend 2 + doctrine 2 Auth Adapter,但每次调用$authService->authenticate($adapter);时,我都会收到类“'不存在的错误。

似乎我的module.config.php中的配置不会被使用。它显示如下:

'authenticationadapter' => array(
        'orm_default' => array(
            'objectManager' => 'doctrine.entitymanager.orm_default',
            'identityClass' => 'Profile\Entity\User',
            'identityProperty' => 'username',
            'credentialProperty' => 'password',
        ),
    ),

但是如果我在authService上创建了一个var_dump,那么所有的set都是null。 在我想要登录的服务中,我打电话给

$authAdapter = $this->getAuthAdapter();
$authAdapter->setIdentityValue($username);
$authAdapter->setCredentialValue($password);

来自$ authAdapter的转储告诉我IdentityValue和CredentialValue 设置正确。

$ authAdabter中的其他内容是:

protected 'options' => 
    object(DoctrineModule\Options\Authentication)[281]
      protected 'objectManager' => 
        object(Doctrine\ORM\EntityManager)[248]
          private 'config' => 
            object(Doctrine\ORM\Configuration)[250]
              ...
          private 'conn' => 
            object(Doctrine\DBAL\Connection)[252]
              ...
          private 'metadataFactory' => 
            object(Doctrine\ORM\Mapping\ClassMetadataFactory)[266]
              ...
          private 'repositories' => 
            array (size=0)
              ...
          private 'unitOfWork' => 
            object(Doctrine\ORM\UnitOfWork)[267]
              ...
          private 'eventManager' => 
            object(Doctrine\Common\EventManager)[242]
              ...
          private 'hydrators' => 
            array (size=0)
              ...
          private 'proxyFactory' => 
            object(Doctrine\ORM\Proxy\ProxyFactory)[268]
              ...
          private 'expressionBuilder' => null
          private 'closed' => boolean false
          private 'filterCollection' => null
      protected 'objectRepository' => null
      protected 'identityClass' => null
      protected 'identityProperty' => null
      protected 'credentialProperty' => null
      protected 'credentialCallable' => null
      protected 'classMetadata' => null
      protected 'storage' => null
      protected '__strictMode__' => boolean true
  protected 'authenticationResultInfo' => null

getAuthAdapter显示如下:

public function getAuthAdapter()
{
    if (null === $this->authAdapter) {
        $this->authAdapter = $this->getServiceManager()
            ->get('doctrine.authenticationadapter.ormdefault');
    }
    return $this->authAdapter;
}

那么有人可以告诉我如何正确设置选项吗?

2 个答案:

答案 0 :(得分:10)

您似乎使用了错误的配置值。如果查看DoctrineORM文档,它们将使用以下命令设置身份验证适配器的配置:

'doctrine' => array(
    'authentication' => array(
        'orm_default' => array(
            'object_manager' => 'Doctrine\ORM\EntityManager',
            'identity_class' => 'Application\Entity\User',
            'identity_property' => 'email',
            'credential_property' => 'password',
        ),
    ),
)

因此,不要在module.config.php中使用authenticationadapter使用authentication;而不是使用objectManager使用object_manager


在Module.php中,您需要添加以下内容:

use Zend\Authentication\AuthenticationService;

...

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'Zend\Authentication\AuthenticationService' => function($serviceManager) {
                return $serviceManager->get('doctrine.authenticationservice.orm_default');

            }
        )
    );
}

在控制器中,您可以使用以下方式访问适配器:

$authService = $this->getServiceLocator()->get('Zend\Authentication\AuthenticationService');

$adapter = $authService->getAdapter();
$adapter->setIdentityValue($data['login']);
$adapter->setCredentialValue($data['password']);

请关注documentation

答案 1 :(得分:0)

如果您使用的是Zend \ Authentication \ AuthenticationService'在Hohner建议的Module.php中,这不适用于BjyAuthorize Module角色和ACL。 BjyAuthorize将默认使用自己的身份验证服务的默认配置,该服务使用' ZfcUser \ Authentication \ Storage \ Db'。要让BjyAuthorize使用Doctrine身份,请将其替换为(或添加)' zfcuser_auth_service'如下:

'zfcuser_auth_service' => function ($serviceManager) {
    return  $authenticationService = $serviceManager->get('doctrine.authenticationservice.orm_default');
},

然后你也可以用类似的方式在控制器中使用它:

$authService = $this->getServiceLocator()->get( 'zfcuser_auth_service' );