Zend 2 + doctrine 2 Auth Адаптер

Я ищу учебник по аутентификации с Zend 2 и Doctrine 2. В частности, по созданию контроллера и адаптера.

Официальная документация слишком глобальна, что мне мало помогает.

Спасибо

РЕДАКТИРОВАТЬ:

я использую "Doctrine Entity" (пространство имен User \ Entity;)

Сущность регистрируется в файле module.config.php:

'doctrine' => array(
    'driver' => array(
        __NAMESPACE__ . '_driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'cache' => 'array',
            'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
        ),
        'orm_default' => array(
            'drivers' => array(
                __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            )
        )          
    ),
)

Но как теперь указать свой ключ identityClass на адаптере? Контроллер:

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel,
    Zend\Authentication\AuthenticationService,
    Doctrine\ORM\EntityManager,
    DoctrineModule\Authentication\Adapter\ObjectRepository as DoctrineAdapter,        
    User\Entity\User,  
    User\Form\UserForm;
class UserController extends AbstractActionController 
{
protected $em;

public function setEntityManager(EntityManager $em)
{
    $this->em = $em;
}

public function getEntityManager()
{
    if (null === $this->em)
        $this->em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    return $this->em;
} 

public function getRepository()
{
    if (null === $this->em) 
        $this->em = $this->getEntityManager()->getRepository('User\Entity\User');
    return $this->em;
} 

public function loginAction()
{
    ....
    ????????????
    $adapter = new DoctrineAdapter();
    $adapter->setIdentityValue($username);
    $adapter->setCredentialValue($password);
    $auth = new AuthenticationService();    
    $result=$auth->authenticate($adapter);
    ????????????

}

}

У меня есть эта ошибка: вызов функции-члена getRepository () для не-объекта в ... doctrine \ doctrine-module \ src \ DoctrineModule \ Options \ AuthenticationAdapter.php в строке 132, строке 123: return $ this-> objectManager-> getRepository ($ this-> identityClass);


person beweed    schedule 23.08.2012    source источник


Ответы (1)


Есть много способов сделать это, но DoctrineModule для zf2 поставляется с адаптером аутентификации на основе доктрины (DoctrineModule\Authentication\Adapter\ObjectRepository). Также существует фабрика по созданию адаптера (DoctrineModule\Service\AuthenticationAdapterFactory). DoctrineMongoODMModule имеет свой module.config.php, настроенный для использования этих сервисов. (Обратите внимание, что фабрика и адаптер будут работать с ORM, но я не уверен, были ли еще добавлены ключи конфигурации в DoctrineORMModule - возможно, кто-то, читающий это, захочет создать PR для этого?) Это соответствующие ключи конфигурации:

    'authenticationadapter' => array(
        'odm_default' => array(
            'objectManager' => 'doctrine.documentmanager.odm_default',
            'identityClass' => 'Application\Model\User',
            'identityProperty' => 'username',
            'credentialProperty' => 'password',
            'credentialCallable' => 'Application\Model\User::hashPassword'
        ),
    ),

identityClass - это документ доктрины, который представляет вашего аутентифицированного пользователя. identityProperty - это обычно имя пользователя. getUsername будет вызываться адаптером для доступа к нему. credentialProperty - обычно пароль. getPassword будет вызываться адаптером для доступа к нему. credentialCallable не является обязательным. Это должен быть вызываемый (метод, статический метод, закрытие), который будет хешировать credentialProperty - вам не нужно этого делать, но обычно это хорошая идея. Адаптер ожидает, что вызываемый объект будет иметь следующую форму: function hashPassword($identity, $plaintext).

Чтобы использовать адаптер аутентификации:

$serviceLocator->get('doctrine.authenticationadapter.odm_default');

Обратите внимание, что все это дает вам только адаптер аутентификации, но на самом деле он не выполняет аутентификацию. Аутентификация происходит примерно так:

$adapter = $serviceLocator->get('doctrine.authenticationadapter.odm_default');
$adapter->setIdentityValue($username);
$adapter->setCredentialValue($password);
$authService = new Zend\Authentication\AuthenticationService
$result = $authService->authenticate($adapter);

Это сохранит весь документ доктрины аутентифицированного пользователя в объекте сеанса. Если вы хотите сохранить только идентификатор документа в объекте сеанса и получать остальную часть аутентифицированного пользовательского документа из БД при каждом запросе, то взгляните на DoctrineModule\Authentication\Storage\ObjectRepository. Это дает новый StorageInterface для Zend\Authentication\AuthenticationService.

person superdweebie    schedule 23.08.2012
comment
привет, большое спасибо за советы. Я пытаюсь использовать DoctrineModule \ Authentication \ Adapter \ ObjectRepository как DoctrineAdapter. но когда я вызываю $ result = $ adapter- ›Authenticate (), я получаю эту ошибку: вызов функции-члена getRepository () для не-объекта. Как и где мне определить свой identityClass? - person beweed; 24.08.2012
comment
Ваш класс идентификации должен быть документом доктрины (для ODM) или сущностью доктрины (для ORM). Определите его, как любой документ / объект. (Не забудьте зарегистрировать свой документ / объект с ключом драйвера в вашем module.config.php, как вы это сделали для всех ваших других документов / объектов). После того, как вы создали свой класс идентификации, используйте клавишу identityClass, чтобы указать на него свой адаптер. В приведенном выше примере класс идентификации - Application\Model\User, но вы можете изменить его как хотите. - person superdweebie; 24.08.2012
comment
Я действительно ценю твою помощь. Я просто редактирую свой пост, чтобы найти свою проблему. - person beweed; 24.08.2012
comment
@beweed Мне кажется, что ваши проблемы не в аутентификации, а в том, чтобы просто заставить сущности работать. В частности, пространство имен выглядит непоследовательным. Итак, вы говорите, что используете User\Entity, тогда ваш драйвер выглядит так, как будто он регистрирует MyModule\Entity\User. Затем в своем классе контроллера вы пытаетесь получить реестр User\Entity\User. Прежде чем пытаться настроить аутентификацию, убедитесь, что ваши объекты доктрины работают правильно. По крайней мере, проверьте, работают ли $em->persist($entity) и $repository->find($id). - person superdweebie; 25.08.2012
comment
Хорошо, модуль и объект имеют одно и то же имя User. Зная это, вам это понятнее? - person beweed; 27.08.2012
comment
хорошо его работа. Я указал @options следующим образом: $ adapter- ›setOptions (array ('objectManager' =› $ this- ›getEntityManager (), 'identityClass' =› 'User \ Entity \ User', 'identityProperty' = ›'username') , 'credentialProperty' = ›'пароль')); :-) Благодарность - person beweed; 27.08.2012
comment
Документ Doctrine теперь покрывает это для ORM: Аутентификация - person herophuong; 14.09.2013