2012-08-23 29 views
6

Estoy buscando un tutorial sobre autenticación con Zend 2 y Doctrine 2. En particular, la creación del controlador y el adaptador.Zend 2 + doctrine 2 Auth Adapter

La documentación oficial es demasiado global y no me ayuda lo suficiente.

gracias

EDIT:

yo uso "Doctrina Entidad" (espacio de nombres de usuario \ Entidad;)

la entidad es registrarse 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: Llamada a una función miembro getRepository() en un no-objeto en la doctrina ... \ doctrina del módulo \ src \ DoctrineModule \ Opciones \ AuthenticationAdapter.php en línea 132 línea 123: return $ this-> objectManager-> getRepository ($ this-> identityClass);

Respuesta

15

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' 
     ), 
    ), 

el 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 llamante tenga la siguiente forma: 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 sólo le da un adaptador authetication, que en realidad no hacer la autenticación. La autenticación se realiza algo como esto:

$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 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 en cada solicitud, eche un vistazo a DoctrineModule\Authentication\Storage\ObjectRepository. Esto proporciona un nuevo StorageInterface para el Zend\Authentication\AuthenticationService.

+0

hola, muchas gracias por los consejos. Estoy tratando de usar DoctrineModule \ Authentication \ Adapter \ ObjectRepository como DoctrineAdapter. pero cuando llamo $ result = $ adapter-> authenticate() tengo este error: Llamar a una función miembro getRepository() en un no objeto. ¿Cómo y dónde puedo definir my identityClass? – beweed

+0

Su clase de identidad debe ser un Documento de Doctrina (para ODM) o Entidad de Doctrina (para ORM). Defínalo como lo harías con cualquier documento/entidad. (No olvide registrar su documento/entidad con una clave de controlador en su 'module.config.php' como lo habrá hecho con todos sus otros documentos/entidades). Una vez que haya creado su clase de identidad, use la clave 'identityClass' para apuntar su adaptador a ella. En el ejemplo anterior, la clase de identidad es 'Application \ Model \ User', pero puede hacer lo que quiera. – superdweebie

+0

realmente aprecio tu ayuda. Acabo de editar mi publicación para ubicar mi problema. – beweed