6

Zend 2 と Doctrine 2 を使用した認証に関するチュートリアルを探しています。特に、コントローラーとアダプターの作成についてです。

公式ドキュメントはグローバルすぎて、私には十分に役に立ちません。

ありがとうございました

編集:

私は "Doctrine Entity" (名前空間 User\Entity;) を使用します

エンティティは、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'
            )
        )          
    ),
)

しかし、どうすればidentityClassキーをアダプタに向けることができますか? コントローラー:

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

}

}

このエラーが発生しました: Call to a member function getRepository() on a non-object in ...doctrine\doctrine-module\src\DoctrineModule\Options\AuthenticationAdapter.php 行 132 行 123 : return $this-> objectManager->getRepository($this->identityClass);

4

1 に答える 1

15

それを行う方法はたくさんありますが、zf2 用の DoctrineModule には doctrine ベースの認証アダプター ( DoctrineModule\Authentication\Adapter\ObjectRepository) が同梱されています。アダプタを作成するためのファクトリもあります ( DoctrineModule\Service\AuthenticationAdapterFactory)。DoctrineMongoODMModule には、これらのサービスを使用するように設定された module.config.php があります。(ファクトリとアダプターは ORM で動作することに注意してください。ただし、設定キーが DoctrineORMModule にまだ追加されているかどうかはわかりません。おそらく、これを読んだ人はそのための PR を作成したいと思うでしょうか?) 関連する設定キーは次のとおりです。

    '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オプションです。これは、credentialProperty をハッシュする呼び出し可能 (メソッド、静的メソッド、クロージャ) である必要があります。これを行う必要はありませんが、通常は良い考えです。アダプターは、callable が次の形式を持つことを期待します: function hashPassword($identity, $plaintext).

認証アダプタを取得するには、次を使用します。

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

これはすべて認証アダプターを提供するだけであり、実際に認証を行うわけではないことに注意してください。認証は次のように行われます。

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

これにより、認証されたユーザーの教義文書全体がセッション オブジェクトに保存されます。ドキュメント ID のみをセッション オブジェクトに格納し、認証されたユーザー ドキュメントの残りを各リクエストごとに DB から取得する場合は、 を参照してくださいDoctrineModule\Authentication\Storage\ObjectRepository。これにより、 に新しい機能が提供StorageInterfaceされますZend\Authentication\AuthenticationService

于 2012-08-23T23:42:52.663 に答える