2012-08-23 32 views
6

Sto cercando un'esercitazione sull'autenticazione con Zend 2 e Doctrine 2. In particolare la creazione del controller e dell'adattatore.Zend 2 + doctrine 2 Auth Adapter

La documentazione ufficiale è troppo globale non mi aiuta abbastanza.

grazie

EDIT:

io uso "Dottrina Entity" (spazio dei nomi utente \ Entity;)

l'entità è registrare nel file di 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' 
      ) 
     )   
    ), 
) 

Ma ora, come posso puntare la mia chiave identityClass al mio adattatore? Controller:

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); 
    ???????????? 

} 

} 

ho ottenuto questo errore: chiamata a una getRepository funzione membro() su un non-oggetto in ... dottrina \ dottrina-modulo \ src \ DoctrineModule \ Options \ AuthenticationAdapter.php su riga 132 riga 123: return $ this-> objectManager-> getRepository ($ this-> identityClass);

risposta

15

Ci sono molti modi per farlo, ma DoctrineModule per zf2 viene fornito con un adattatore di autenticazione basato su dottrina (DoctrineModule\Authentication\Adapter\ObjectRepository). C'è anche una fabbrica per creare l'adattatore (DoctrineModule\Service\AuthenticationAdapterFactory). DoctrineMongoODMModule ha il suo module.config.php configurato per utilizzare questi servizi. (Si noti che la fabbrica e l'adattatore funzioneranno con ORM, ma non sono sicuro che le chiavi di configurazione siano già state aggiunte a DoctrineORMModule - forse qualcuno che legge questo vorrebbe creare un PR per questo?) Queste sono le chiavi di configurazione rilevanti:

'authenticationadapter' => array(
     'odm_default' => array(
      'objectManager' => 'doctrine.documentmanager.odm_default', 
      'identityClass' => 'Application\Model\User', 
      'identityProperty' => 'username', 
      'credentialProperty' => 'password', 
      'credentialCallable' => 'Application\Model\User::hashPassword' 
     ), 
    ), 

il identityClass è il documento dottrina che rappresenta il tuo utente autenticato. Il identityProperty è normalmente il nome utente. getUsername verrà chiamato dall'adattatore per accedere a questo. credentialProperty è normalmente la password. getPassword verrà chiamato dall'adattatore per accedere a questo. credentialCallable è facoltativo. Dovrebbe essere un callable (metodo, metodo statico, chiusura) che avrà hash the credentialProperty - non è necessario farlo, ma normalmente è una buona idea. L'adattatore si aspetta che il callable abbia il seguente formato: function hashPassword($identity, $plaintext).

Per ottenere l'uso dell'adattatore di autenticazione:

$serviceLocator->get('doctrine.authenticationadapter.odm_default'); 

Si noti che tutto questo ti dà solo un adattatore authetication, ma in realtà non fare l'autenticazione. L'autenticazione viene fatto qualcosa di simile:

$adapter = $serviceLocator->get('doctrine.authenticationadapter.odm_default'); 
$adapter->setIdentityValue($username); 
$adapter->setCredentialValue($password); 
$authService = new Zend\Authentication\AuthenticationService 
$result = $authService->authenticate($adapter); 

Questo memorizzerà l'intero documento dottrina l'utente autenticato nell'oggetto sessione. Se si desidera archiviare solo l'ID del documento nell'oggetto di sessione e recuperare il resto del documento utente autenticato dal DB ogni richiesta, quindi dare un'occhiata a DoctrineModule\Authentication\Storage\ObjectRepository. Questo fornisce un nuovo StorageInterface per il Zend\Authentication\AuthenticationService.

+0

ciao, grazie mille per i suggerimenti. Sto provando ad usare DoctrineModule \ Authentication \ Adapter \ ObjectRepository come DoctrineAdapter. ma quando chiamo $ result = $ adapter-> authenticate() ho questo errore: chiama ad una funzione membro getRepository() su un non-oggetto. Come e dove definisco la mia identityClass? – beweed

+0

La classe di identità deve essere Doctrine Document (per ODM) o Doctrine Entity (per ORM). Definirlo come si farebbe con qualsiasi documento/entità. (Non dimenticare di registrare il tuo documento/entità con una chiave del driver nel tuo 'module.config.php' come avresti fatto per tutti i tuoi altri documenti/entità). Una volta creata la tua classe di identità, usa la chiave 'identityClass' per puntare la tua scheda su di essa. Nell'esempio sopra, la classe di identità è 'Applicazione \ Modello \ Utente', ma puoi farla come vuoi. – superdweebie

+0

apprezzo molto il tuo aiuto. Ho appena modificato il mio post per individuare il mio problema. – beweed