2013-03-02 5 views
6

Я хотел бы иметь аутентификацию с использованием Doctrine 2 и ZF2. Чтобы получить некоторую помощь, я использовал Zend 2 + doctrine 2 Auth Adapter, но каждый раз, когда я вызываю $authService->authenticate($adapter);, я получаю сообщение об ошибке, что класс '' не существует.Zend2 + Doctrine2 Аутентификация

Кажется, что config из моего module.config.php выиграл # т. Он показывает, как это:

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

Но если я сделал var_dump на authService все множества равны нулю. В моей службе, где я хочу, чтобы сделать вход Я называю

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

Так может кто-нибудь сказать мне, как установить параметры правильно?

ответ

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', 
     ), 
    ), 
) 

Таким образом, вместо того, чтобы использовать authenticationadapter использовать authentication в вашем module.config.php; вместо использования 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.

+0

Хорошо меняю но теперь он сообщает мне, что «Zend \ ServiceManager \ ServiceManager :: get не удалось получить или создать экземпляр для doctrine.authentication.orm_default'. Я изменяю getter на 'public function getAuthAdapter() { if (null === $ this-> authAdapter) { $ this-> authAdapter = $ this-> getServiceManager() -> get ('doctrine.authentication ,orm_default '); } return $ this-> authAdapter; ' –

+0

См. Обновленный ответ – hohner

+0

Спасибо за вашу помощь. Теперь остается только одна проблема. После '$ authResult = $ authService-> authenticate();' Я получаю пустую страницу. Нет ошибки, ничего. –

0

Если вы используете 'Zend \ Authentication \ AuthenticationService' в Module.php, как предложено Hohner, это не будет работать с ролью 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'); 
Смежные вопросы