doctrine2 - Zend 2+doctrine 2 Auth Adapter
zend-framework2 zend-auth (1)
Hay muchas maneras de hacerlo, pero DoctrineModule para zf2 se envía con un adaptador de autenticación basado en doctrina ( DoctrineModule/Authentication/Adapter/ObjectRepository
). También hay una fábrica para crear el adaptador ( DoctrineModule/Service/AuthenticationAdapterFactory
). DoctrineMongoODMModule tiene su module.config.php configurado para usar estos servicios. (Tenga en cuenta que la fábrica y el adaptador funcionarán con ORM, pero no estoy seguro de si las claves de configuración se han agregado a DoctrineORMModule aún; ¿tal vez alguien que lea esto desearía crear un RP para eso?) Estas son las claves de configuración relevantes:
''authenticationadapter'' => array(
''odm_default'' => array(
''objectManager'' => ''doctrine.documentmanager.odm_default'',
''identityClass'' => ''Application/Model/User'',
''identityProperty'' => ''username'',
''credentialProperty'' => ''password'',
''credentialCallable'' => ''Application/Model/User::hashPassword''
),
),
identityClass
es el documento de doctrina que representa a su usuario autenticado. El identityProperty
es normalmente el nombre de usuario. getUsername
será llamado por el adaptador para acceder a esto. credentialProperty
es normalmente la contraseña. getPassword
será llamado por el adaptador para acceder a esto. credentialCallable
es opcional. Debería ser un método invocable (método, método estático, cierre) que elimine la Propiedad credential; no es necesario que lo haga, pero normalmente es una buena idea. El adaptador esperará que el invocable tenga el siguiente formato: function hashPassword($identity, $plaintext)
.
Para obtener el uso del adaptador de autenticación:
$serviceLocator->get(''doctrine.authenticationadapter.odm_default'');
Tenga en cuenta que todo esto solo le proporciona un adaptador de autenticación, en realidad no realiza la autenticación. La autenticación se realiza de la siguiente manera:
$adapter = $serviceLocator->get(''doctrine.authenticationadapter.odm_default'');
$adapter->setIdentityValue($username);
$adapter->setCredentialValue($password);
$authService = new Zend/Authentication/AuthenticationService
$result = $authService->authenticate($adapter);
Esto almacenará todo el documento de doctrina del usuario autenticado en el objeto de sesión. Si desea almacenar solo el ID del documento en el objeto de la sesión y recuperar el resto del documento del usuario autenticado a partir del DB cada solicitud, eche un vistazo a DoctrineModule/Authentication/Storage/ObjectRepository
. Esto proporciona una nueva StorageInterface
para Zend/Authentication/AuthenticationService
.
Estoy buscando un tutorial sobre autenticación con Zend 2 y Doctrine 2. En particular, la creación del controlador y el adaptador.
La documentación oficial es demasiado global y no me ayuda lo suficiente.
gracias
EDITAR:
utilizo "Doctrine Entity" (espacio de nombres User / Entity;)
La entidad se registra en el archivo 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''
)
)
),
)
Pero ahora, ¿cómo puedo apuntar mi clave identityClass a mi adaptador? Controlador :
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);
????????????
}
}
Tengo este error: Llamar a una función miembro getRepository () en un no objeto en ... doctrine / doctrine-module / src / DoctrineModule / Options / AuthenticationAdapter.php en línea 132 línea 123: return $ this-> objectManager-> getRepository ($ this-> identityClass);