2012-08-23 8 views
6

Ich bin auf der Suche nach einem Tutorial zur Authentifizierung mit Zend 2 und Doctrine 2. Insbesondere die Erstellung der Controller und Adapter.Zend 2 + Lehre 2 Auth Adapter

Die offizielle Dokumentation ist zu global nicht genug mir zu helfen.

danke

EDIT:

i "Lehre Entity" verwenden (Namespace User \ Entity;)

Das Entity ist in module.config.php Datei registrieren:

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

Aber jetzt, wie kann ich meinen identityClass Schlüssel auf meinen Adapter zeigen? 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); 
    ???????????? 

} 

} 

ich diesen Fehler haben: Rufen Sie auf eine Elementfunktion getRepository() auf einem Nicht-Objekt in ... Lehre \ Lehre-Modul \ src \ DoctrineModule \ Options \ AuthenticationAdapter.php auf Zeile 132 Zeile 123: return $ this-> objectManager-> getRepository ($ this-> identityClass);

Antwort

15

Es gibt viele Möglichkeiten, dies zu tun, aber DoctrineModule für zf2 wird mit einem dokumentenbasierten Authentifizierungsadapter geliefert (DoctrineModule\Authentication\Adapter\ObjectRepository). Es gibt auch eine Fabrik zum Erstellen des Adapters (DoctrineModule\Service\AuthenticationAdapterFactory). DoctrineMongoODMModule hat seine module.config.php eingerichtet, um diese Dienste zu verwenden. (Beachten Sie, dass das Werk und der Adapter mit ORM funktionieren, aber ich bin mir nicht sicher, ob die Konfigurationsschlüssel zu DoctrineORMModule hinzugefügt wurden - vielleicht möchte jemand, der dies liest, dafür eine PR erstellen?) Dies sind die relevanten Konfigurationsschlüssel:

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

die identityClass ist die Lehre Dokument, das Ihre authentifizierten Benutzer darstellt. Die identityProperty ist normalerweise der Benutzername. getUsername wird vom Adapter aufgerufen, um darauf zuzugreifen. credentialProperty ist normalerweise das Passwort. getPassword wird vom Adapter aufgerufen, um darauf zuzugreifen. credentialCallable ist optional. Es sollte eine Callable (Methode, statische Methode, Closure) sein, die die credentialProperty hashed - Sie müssen dies nicht tun, aber es ist normalerweise eine gute Idee. Der Adapter erwartet, dass das aufrufbare Format das folgende Format hat: function hashPassword($identity, $plaintext).

den Authentifizierungs-Adapter benutzen Sie:

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

Beachten Sie, dass Ihnen das alles ein authetication Adapter nur gibt, tut es nicht eigentlich die Authentifizierung tun. Die Authentifizierung erfolgt in etwa wie folgt:

Dies wird das gesamte Doktrin-Dokument des authentifizierten Benutzers im Sitzungsobjekt speichern. Wenn Sie nur die Dokument-ID im Sitzungsobjekt speichern und den Rest des autorisierten Benutzerdokuments aus der DB für jede Anforderung abrufen möchten, sehen Sie sich DoctrineModule\Authentication\Storage\ObjectRepository an. Dies liefert eine neue StorageInterface für die Zend\Authentication\AuthenticationService.

+0

Hallo, vielen Dank für die Tipps. Ich versuche DoctrineModule \ Authentication \ Adapter \ ObjectRepository als DoctrineAdapter zu verwenden. aber wenn ich $ result = $ adapter-> authenticate() aufrufen, habe ich diesen Fehler: Aufruf einer Memberfunktion getRepository() auf einem Nicht-Objekt. Wie und wo definiere ich meine identityClass? – beweed

+0

Ihre Identitätsklasse sollte ein Doctrine-Dokument (für ODM) oder Doctrine-Entity (für ORM) sein. Definieren Sie es wie jedes Dokument/jede Entität. (Vergessen Sie nicht, Ihr Dokument/Ihre Entity mit einem Treiberschlüssel in Ihrer 'module.config.php' zu registrieren, wie Sie es für all Ihre anderen Dokumente/Entitäten getan haben). Nachdem Sie Ihre Identitätsklasse erstellt haben, verwenden Sie den Schlüssel "identityClass", um den Adapter darauf zu verweisen. Im obigen Beispiel lautet die Identitätsklasse "Application \ Model \ User", Sie können jedoch festlegen, was Sie wollen. – superdweebie

+0

Ich schätze Ihre Hilfe sehr. Ich bearbeite gerade meinen Beitrag, um mein Problem zu lokalisieren. – beweed