2012-08-23 25 views
6

Zend 2 ve Doctrine 2 ile kimlik doğrulama hakkında bir eğitim arıyorum. Özellikle denetleyicinin ve bağdaştırıcının oluşturulması.Zend 2 + doctrine 2 Auth Bağdaştırıcısı

Resmi belgeler çok genel olarak bana yeterince yardımcı olmuyor.

teşekkür ederim

DÜZENLEME: i "Doktrini Varlığı" kullanmak

(ad Kullanıcı \ Varlık;)

Varlık module.config.php dosyasında kayıt olan:

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

Ancak şimdi, identityClass anahtarımı adaptörüme nasıl yönlendirebilirim? Denetleyici: Bu hata var

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

} 

} 

: olmayan bir nesne içinde ... doktrin \ doktrin-modül \ src \ DoctrineModule \ Options \ AuthenticationAdapter.php üzerine üye işlev getRepository() çağır satır 132 satır 123: dönüş $ this-> objectManager-> getRepository ($ this-> identityClass);

cevap

15

Bunu yapmanın birçok yolu vardır, ancak doktrin tabanlı bir kimlik doğrulama bağdaştırıcısı olan (DoctrineModule\Authentication\Adapter\ObjectRepository) zf2 gemileri için DoctrineModule. Bağdaştırıcıyı (DoctrineModule\Service\AuthenticationAdapterFactory) oluşturmak için bir fabrika da vardır. DoctrineMongoODMModule, bu hizmetleri kullanmak için module.config.php'ye sahiptir. (Fabrika ve bağdaştırıcının ORM ile çalışacağını unutmayın, ancak yapılandırma anahtarlarının DoctrineORMModule'e henüz eklenip eklenmediğinden emin değilim - belki bunu okuyan biri bunun için bir PR oluşturmak ister mi?) Bunlar ilgili yapılandırma anahtarlarıdır: identityClass

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

kimlik doğrulaması yapılmış kullanıcıyı temsil doktrin belgedir. identityProperty normalde kullanıcı adıdır. Buna erişmek için adaptör tarafından getUsername çağrılacaktır. credentialProperty normalde paroladır. Buna erişmek için adaptör tarafından getPassword çağrılacaktır. credentialCallable isteğe bağlıdır. CredentialProperty hash bir geçici (yöntem, statik yöntem, kapatma) olmalıdır - bunu yapmak gerekmez, ancak normalde iyi bir fikir. Bağdaştırıcı, çağrılabilir kalıbın aşağıdaki forma sahip olmasını bekler: function hashPassword($identity, $plaintext).

kimlik adaptörü kullanımını almak için: Bütün bu sadece size bir authetication adaptörü verir

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

Not, aslında kimlik doğrulaması yapmaz. Doğrulama böyle bir şey yapılır:

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

Bu oturum nesnesi kimliği doğrulanmış kullanıcının tüm doktrini belgesini saklayacaktır. Oturum nesnesinde yalnızca belge kimliğini saklamak ve her istekte bulunan her kullanıcı için birleştirilmiş kullanıcı belgesinin geri kalanını almak isterseniz, DoctrineModule\Authentication\Storage\ObjectRepository'a bakın. Bu, Zend\Authentication\AuthenticationService için yeni bir StorageInterface sağlar.

+0

Merhaba, ipuçları için çok teşekkürler. DoctrineModule \ Authentication \ Adapter \ ObjectRepository'u DoctrineAdapter olarak kullanmaya çalışıyorum. fakat $ result = $ adapter-> authenticate() işlevini çağırdığımda bu hatayı aldım: Nesne olmayan bir nesne üzerinde getRepository() işlevine çağrı yapın. IdentityClass'ımı nasıl ve nerede tanımlarım? – beweed

+0

Kimlik sınıfınız bir Doktrin Belgesi (ODM için) veya Doktrin Varlığı (ORM için) olmalıdır. Herhangi bir belge/varlık olarak tanımlayın. (Belgenizi/varlığınızı, tüm diğer belgeleriniz/öğeleriniz için yapacağınız gibi, 'module.config.php' dosyanızdaki bir sürücü anahtarı ile kaydetmeyi unutmayın. Kimlik sınıfınızı oluşturduktan sonra, adaptörünüzü işaret etmek için 'identityClass' tuşunu kullanın. Yukarıdaki örnekte, kimlik sınıfı "Application \ Model \ User" dır, ancak istediğiniz her şeyi yapabilirsiniz. – superdweebie

+0

Yardımlarınız için gerçekten minnettarım. Sorunumu yerleştirmek için yayınımı düzenliyorum. – beweed

İlgili konular