2012-08-23 34 views
6

मैं ज़ेंड 2 और सिद्धांत 2 के साथ प्रमाणीकरण पर एक ट्यूटोरियल ढूंढ रहा हूं। विशेष रूप से नियंत्रक और एडाप्टर का निर्माण।ज़ेंड 2 + सिद्धांत 2 ऑथ एडाप्टर

आधिकारिक दस्तावेज बहुत वैश्विक है जो मुझे पर्याप्त मदद नहीं करता है।

धन्यवाद

संपादित करें:

मैं "सिद्धांत संस्था" का उपयोग करें (नाम स्थान उपयोगकर्ता \ इकाई;)

इकाई 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' 
      ) 
     )   
    ), 
) 

लेकिन अब, मैं अपने एडाप्टर को अपनी पहचान क्लास कुंजी कैसे इंगित कर सकता हूं? नियंत्रक:

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

} 

} 

मैं यह त्रुटि मिल गया है: एक गैर वस्तु में ... सिद्धांत \ सिद्धांत मॉड्यूल \ src \ DoctrineModule \ विकल्प \ AuthenticationAdapter.php पर पर एक सदस्य समारोह getRepository() पर की गई कॉल लाइन 132 लाइन 123: $ this-> ऑब्जेक्ट प्रबंधक-> getRepository ($ this-> पहचान क्लास);

उत्तर

15

ऐसा करने के कई तरीके हैं, लेकिन एक सिद्धांत आधारित प्रमाणीकरण एडाप्टर (DoctrineModule\Authentication\Adapter\ObjectRepository) के साथ zf2 जहाजों के लिए DoctrineModule। एडाप्टर बनाने के लिए एक कारखाना भी है (DoctrineModule\Service\AuthenticationAdapterFactory)। DoctrineMongoODM मॉड्यूल में यह मॉड्यूल.config.php इन सेवाओं का उपयोग करने के लिए स्थापित है। (ध्यान दें कि कारखाना और एडाप्टर ओआरएम के साथ काम करेगा, लेकिन मुझे यकीन नहीं है कि कॉन्फ़िगर कुंजी को अभी तक DoctrineORMModule में जोड़ा गया है - शायद कोई ऐसा जो इसे पढ़ता है, उसके लिए पीआर बनाना चाहेगा?) ये प्रासंगिक कॉन्फ़िगर कुंजी हैं:

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

identityClass सिद्धांत दस्तावेज है कि आपका अधिकृत उपयोगकर्ता का प्रतिनिधित्व करता है। identityProperty आमतौर पर उपयोगकर्ता नाम है। getUsername एडाप्टर द्वारा इसे एक्सेस करने के लिए बुलाया जाएगा। credentialProperty आमतौर पर पासवर्ड है। getPassword एडाप्टर द्वारा इसे एक्सेस करने के लिए बुलाया जाएगा। credentialCallable वैकल्पिक है। यह एक कॉल करने योग्य (विधि, स्थैतिक विधि, बंद होना चाहिए) है जो क्रेडेंशियल प्रॉपर्टी होगा - आपको ऐसा करने की आवश्यकता नहीं है, लेकिन यह आमतौर पर एक अच्छा विचार है। एडाप्टर कॉल करने योग्य को निम्नलिखित फॉर्म होने की उम्मीद करेगा: function hashPassword($identity, $plaintext)

प्रमाणीकरण एडाप्टर उपयोग पाने के लिए:

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

ध्यान दें कि यह सब केवल आप एक authetication एडाप्टर देता है, यह वास्तव में प्रमाणीकरण नहीं करता है। प्रमाणीकरण कुछ इस तरह से किया जाता है:

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

इस सत्र में वस्तु में प्रमाणीकृत उपयोगकर्ता के पूरे सिद्धांत दस्तावेज़ संग्रहीत करेगा। यदि आप सत्र ऑब्जेक्ट में केवल दस्तावेज़ आईडी को स्टोर करना चाहते हैं, और शेष अचेतन उपयोगकर्ता दस्तावेज़ को पुनर्प्राप्त करना प्रत्येक अनुरोध को डीबी बनाते हैं, तो DoctrineModule\Authentication\Storage\ObjectRepository पर एक नज़र डालें। यह Zend\Authentication\AuthenticationService के लिए एक नया StorageInterface प्रदान करता है।

+0

हाय, सुझावों के लिए बहुत बहुत धन्यवाद। मैं DoctrineModule \ प्रमाणीकरण \ एडाप्टर \ ऑब्जेक्ट रिपोजिटरी को DoctrineAdapter के रूप में उपयोग करने का प्रयास कर रहा हूं। लेकिन जब मैं $ परिणाम = $ adapter-> प्रमाणीकृत() को कॉल करता हूं तो मुझे यह त्रुटि मिली है: एक गैर-ऑब्जेक्ट पर किसी सदस्य फ़ंक्शन getRepository() पर कॉल करें। मैं अपनी पहचान क्लास को कैसे और कहां परिभाषित करूं? – beweed

+0

आपकी पहचान श्रेणी एक डॉक्टरेट दस्तावेज़ (ओडीएम के लिए) या सिद्धांत इकाई (ओआरएम के लिए) होना चाहिए। इसे परिभाषित करें क्योंकि आप कोई दस्तावेज़/इकाई करेंगे। (अपने दस्तावेज़/इकाई को अपने 'module.config.php' में ड्राइवर कुंजी के साथ पंजीकृत करना न भूलें क्योंकि आपने अपने सभी अन्य दस्तावेज़ों/संस्थाओं के लिए किया होगा)। एक बार जब आप अपनी पहचान कक्षा बना लेंगे, तो अपने एडाप्टर को इंगित करने के लिए 'पहचान क्लास' कुंजी का उपयोग करें। उपर्युक्त उदाहरण में, पहचान वर्ग 'एप्लिकेशन \ मॉडल \ उपयोगकर्ता' है, लेकिन आप इसे जो कुछ भी चाहते हैं उसे बना सकते हैं। – superdweebie

+0

मैं वास्तव में आपकी मदद की सराहना करता हूं। मैं अपनी समस्या को स्थापित करने के लिए बस अपनी पोस्ट संपादित करता हूं। – beweed

संबंधित मुद्दे