我想使用Doctrine 2和ZF2进行身份验证。为了获得一些帮助,我使用了Zend 2 + doctrine 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,那么所有的set都是null。 在我想要登录的服务中,我打电话给
$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;
}
那么有人可以告诉我如何正确设置选项吗?
答案 0 :(得分: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中使用authenticationadapter
使用authentication
;而不是使用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。
答案 1 :(得分:0)
如果您使用的是Zend \ Authentication \ AuthenticationService'在Hohner建议的Module.php中,这不适用于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' );