2012-08-23 21 views
6

Szukam samouczka na temat uwierzytelniania z Zend 2 i Doctrine 2. W szczególności tworzenie kontrolera i adaptera.Zend 2 + doctrine 2 Auth Adapter

Oficjalna dokumentacja jest zbyt ogólnikowa, nie pomaga mi to w wystarczającym stopniu.

dziękuję

EDIT:

używam "doktryny podmiotem" (nazw użytkownika \ Entity;)

jednostka jest zarejestrować w pliku 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' 
      ) 
     )   
    ), 
) 

Ale jak mogę wskazać mój klucz identityClass na mój adapter? Kontroler:

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

} 

} 

mam ten błąd: Zadzwoń do getRepository funkcji członka() na non-object w ... doktryny \ doktryna modułu \ src \ DoctrineModule \ Options \ AuthenticationAdapter.php na wiersz 132 wiersz 123: return $ this-> objectManager-> getRepository ($ this-> identityClass);

Odpowiedz

15

Istnieje wiele sposobów, aby to zrobić, ale DoctrineModule dla statków zf2 z adapterem uwierzytelniania opartym na doktrynie (DoctrineModule\Authentication\Adapter\ObjectRepository). Istnieje również fabryka do utworzenia adaptera (DoctrineModule\Service\AuthenticationAdapterFactory). DoctrineMongoODMModule ma moduł module.config.php skonfigurowany do korzystania z tych usług. (Zauważ, że fabryka i adapter będą działały z ORM, ale nie jestem pewien, czy klucze konfiguracyjne zostały jeszcze dodane do DoctrineORMModule - może ktoś, kto to czyta, chciałby utworzyć dla niego PR?) Są to odpowiednie klucze konfiguracyjne:

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

identityClass jest dokumentem, który reprezentuje swoją doktrynę uwierzytelnionego użytkownika. identityProperty jest zwykle nazwą użytkownika. getUsername zostanie wywołany przez adapter, aby uzyskać do niego dostęp. credentialProperty jest zwykle hasłem. getPassword zostanie wywołany przez adapter, aby uzyskać do niego dostęp. credentialCallable jest opcjonalne. Powinien to być wywoływalny (metoda, metoda statyczna, zamknięcie), który będzie mieszał kwalifikację Właściwość - nie musisz tego robić, ale zazwyczaj jest to dobry pomysł. Adapter oczekuje, że żądanie wywołania ma następującą postać: function hashPassword($identity, $plaintext).

Aby uzyskać użycia adaptera uwierzytelniania:

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

Zauważ, że to wszystko tylko daje adapter authetication, nie faktycznie uwierzytelniania. Uwierzytelnianie odbywa się w następujący sposób:

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

Spowoduje to zapisanie całego dokumentu doktryny uwierzytelnionego użytkownika w obiekcie sesji. Jeśli chcesz przechowywać tylko identyfikator dokumentu w obiekcie sesji i pobrać resztę autetnicowanego dokumentu użytkownika z DB każdego żądania, to spójrz na DoctrineModule\Authentication\Storage\ObjectRepository. Zapewnia to nowy StorageInterface dla .

+0

Witam, bardzo dziękuję za porady. Próbuję użyć DoctrineModule \ Authentication \ Adapter \ ObjectRepository jako DoctrineAdapter. , ale gdy zadzwonię do $ result = $ adapter-> authenticate() mam ten błąd: wywołanie funkcji member getRepository() na obiekcie nie będącym obiektem. Jak i gdzie mogę zdefiniować moje identityClass? – beweed

+0

Twoja klasa tożsamości powinna być dokumentem Doctrine (dla ODM) lub Doctrine Entity (dla ORM). Zdefiniuj go tak jak każdy dokument/encję. (Nie zapomnij zarejestrować dokumentu/podmiot za pomocą klucza sterownika w pliku 'module.config.php', jak to zrobisz dla wszystkich twoich innych dokumentów/podmiotów). Po utworzeniu klasy tożsamości użyj klucza 'identityClass', aby wskazać na nim adapter. W powyższym przykładzie klasą tożsamości jest 'Application \ Model \ User', ale możesz zrobić to, co chcesz. – superdweebie

+0

Naprawdę doceniam twoją pomoc. Właśnie edytuję swój post, aby zlokalizować mój problem. – beweed