我正在寻找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);
????????????
}
}
我遇到了这个错误:在第132行的... doctrine \ doctrine-module \ src \ DoctrineModule \ Options \ AuthenticationAdapter.php中的非对象上调用成员函数getRepository() 第123行:返回$ this-> objectManager-> getRepository($ this-> identityClass);
答案 0 :(得分:15)
有很多方法可以做到这一点,但是ztr2的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进行散列 - 你不需要这样做,但它通常是一个好主意。适配器将期望callable具有以下形式: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);
这会将经过身份验证的用户的整个学说文档存储在会话对象中。如果您只想在会话对象中存储文档ID,并从每个请求的数据库中检索其余的已验证用户文档,请查看DoctrineModule\Authentication\Storage\ObjectRepository
。这为StorageInterface
提供了新的Zend\Authentication\AuthenticationService
。