6

我正在寻找有关使用 Zend 2 和 Doctrine 2 进行身份验证的教程。特别是控制器和适配器的创建。

官方文档太全球化了,对我的帮助不够。

谢谢你

编辑:

我使用“Doctrine 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);
    ????????????

}

}

我遇到了这个错误:在第 132 行第 123 行的 ...doctrine\doctrine-module\src\DoctrineModule\Options\AuthenticationAdapter.php 中的非对象上调用成员函数 getRepository():返回 $this-> objectManager->getRepository($this->identityClass);

4

1 回答 1

15

有很多方法可以做到这一点,但是 zf2 的 DoctrineModule 附带了一个基于原则的身份验证适配器 ( 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);

This will store the whole doctrine document of the authenticated user in the session object. If you want to store only the document ID in the session object, and retrieve the rest of the authetnicated user document form the DB each request, then take a look at DoctrineModule\Authentication\Storage\ObjectRepository. This provides a new StorageInterface for the Zend\Authentication\AuthenticationService.

于 2012-08-23T23:42:52.663 回答