2012-08-23 1 views
6

Je cherche un tutoriel sur l'authentification avec Zend 2 et Doctrine 2. En particulier la création du contrôleur et de l'adaptateur.Zend 2 + doctrine 2 Auth Adapter

La documentation officielle est trop globale ne m'aide pas assez.

merci

EDIT:

utiliser "Doctrine Entité" (espace de nom utilisateur \ Entité;)

L'entité est s'inscrire dans le fichier 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' 
      ) 
     )   
    ), 
) 

Mais maintenant, comment puis-je pointer ma clé identityClass vers mon adaptateur? 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); 
    ???????????? 

} 

} 

J'ai eu cette erreur: appel à une fonction de membre getRepository() sur un non-objet dans ... doctrine \ doctrine module \ src \ DoctrineModule \ Options \ AuthenticationAdapter.php sur ligne 132 ligne 123: return $ this-> objectManager-> getRepository ($ this-> identityClass);

Répondre

15

Il existe de nombreux moyens de le faire, mais DoctrineModule for zf2 est fourni avec un adaptateur d'authentification basé sur la doctrine (DoctrineModule\Authentication\Adapter\ObjectRepository). Il existe également une usine pour créer l'adaptateur (DoctrineModule\Service\AuthenticationAdapterFactory). DoctrineMongoODMModule a son module.config.php configuré pour utiliser ces services. (Notez que l'usine et l'adaptateur fonctionneront avec ORM, mais je ne suis pas sûr si les clés de configuration ont été ajoutées à DoctrineORMModule - peut-être quelqu'un qui lit cela voudrait créer un PR pour cela?) Voici les clés de configuration pertinentes:

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

le identityClass est le document de doctrine qui représente votre utilisateur authentifié. Le identityProperty est normalement le nom d'utilisateur. getUsername sera appelée par l'adaptateur pour y accéder. credentialProperty est normalement le mot de passe. getPassword sera appelée par l'adaptateur pour y accéder. credentialCallable est facultatif. Ce devrait être un callable (méthode, méthode statique, fermeture) qui va hacher le credentialProperty - vous n'avez pas besoin de faire cela, mais c'est normalement une bonne idée. L'adaptateur s'attend à ce que l'appel soit de la forme suivante: function hashPassword($identity, $plaintext).

Pour obtenir l'utilisation de l'adaptateur d'authentification:

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

Notez que tout cela ne vous donne un adaptateur authetication, il ne fait pas réellement l'authentification. L'authentification se fait quelque chose comme ceci:

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

Cela va stocker tout le document de doctrine de l'utilisateur authentifié dans l'objet de session. Si vous souhaitez stocker uniquement l'ID de document dans l'objet de session et récupérer le reste du document d'utilisateur authetnicated à partir de la base de données de chaque demande, jetez un coup d'œil à DoctrineModule\Authentication\Storage\ObjectRepository. Cela fournit un nouveau StorageInterface pour le Zend\Authentication\AuthenticationService.

+0

salut, merci beaucoup pour les conseils. J'essaie d'utiliser DoctrineModule \ Authentication \ Adapter \ ObjectRepository comme DoctrineAdapter. mais quand j'appelle $ result = $ adapter-> authenticate() j'ai cette erreur: Appel à une fonction membre getRepository() sur un non-objet. Comment et où dois-je définir ma identityClass? – beweed

+0

Votre classe d'identité doit être un document Doctrine (pour ODM) ou Doctrine Entity (pour ORM). Définissez-le comme vous le feriez pour tout document/entité. (N'oubliez pas d'enregistrer votre document/entité avec une clé de pilote dans votre module.config.php comme vous l'aurez fait pour tous vos autres documents/entités). Une fois que vous avez créé votre classe d'identité, utilisez la clé 'identityClass' pour pointer votre carte sur celle-ci. Dans l'exemple ci-dessus, la classe d'identité est 'Application \ Model \ User', mais vous pouvez en faire ce que vous voulez. – superdweebie

+0

J'apprécie vraiment votre aide. Je viens de modifier mon message pour localiser mon problème. – beweed

Questions connexes