6

我想使用 Doctrine 2 和 ZF2 进行身份验证。为了获得一些帮助,我使用了Zend 2 + dictionary 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,所有的集合都是空的。在我想要登录的服务中,我调用

$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;
}

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

4

2 回答 2

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中使用authenticationadapteruse ;authentication而不是使用objectManageruseobject_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']);

请遵循文档

于 2013-03-02T15:17:41.313 回答
0

If you are using 'Zend\Authentication\AuthenticationService' in Module.php as suggested by Hohner, this will not work with the BjyAuthorize Module roles and ACL. BjyAuthorize will default to its own default configuration of the Authentication service which uses 'ZfcUser\Authentication\Storage\Db'. To get BjyAuthorize to use the Doctrine identity replace it with (or add ) 'zfcuser_auth_service' as follows:

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

Then you also use it in the controller in a similar way:

$authService = $this->getServiceLocator()->get( 'zfcuser_auth_service' );
于 2014-06-04T12:57:37.167 回答