2012年10月11日木曜日

Zend Framework 2 でのログイン機能

前回に引き続き、ログイン機能を実装します。

まずはログインフォームを作成します。前回同様に、まずはフォームを作成します。

<?php

//module/Auth/src/Auth/Form/Login.php

namespace Auth\Form;

use Zend\Form\Form;
use Zend\Form\Element;

class LoginForm extends Form
{
    public function __construct()
    { 
        parent::__construct();
        $this->add(array(
            'name' => 'email',
            'attributes' => array(
                'type' => 'text',
            ),
            'options' => array(
                'label' => 'email',
            ),
        ));
        $this->add(array(
            'name' => 'password',
            'attributes' => array(
                'type' => 'password',
            ),
            'options' => array(
                'label' => 'password',
            ),
        ));
        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type' => 'submit',
                'value' => 'login',
            ),
        ));
        $this->add(new Element\Csrf('csrf'));
    }

}

続いてこちらも前回を踏襲し、コントローラーを以下のようにします。

<?php
//module/Auth/src/Auth/Controller/AuthController.php

//追加
use Auth\Form\LoginForm;

    //追加
    public function loginAction()
    { 
        $form = new LoginForm();
        $request = $this->getRequest();

        if($request->isPost()){
            $user = new User();
            $form->setInputFilter($user->getInputFilter());
            $form->setData($request->getPost());

            if($form->isValid()) {
                exit('ログインが試みられました');
            }
        }

        return array('form' => $form);
    }




最後にビューを変更します。



 <?php

$title = 'signup form';
$this->headTitle($title);

$form = $this->form;
echo $this->form()->openTag($form);
echo $this->formRow($form->get('email'));
echo $this->formRow($form->get('password'));
echo $this->formHidden($form->get('csrf'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag($form);
?>

これでログインフォームが出現すると思います。

それではログインフォームを実装しましょう。Zend Framework 2 の認証機能は前作からほぼ変わらず、インターフェイスを継承したアダプタークラスが
実行します。LDAPを用いる場合と同様に、データベースでの認証もAdapterInterfaceを実装したDbTableクラスのAuthenticationメソッドで実行されます。これは認証機能なので、実際にデータベースに接続するにはデータベースと接続するアダプターを利用することになります。

ということで、まずはデータベースと接続するアダプターを取得出来るようにしましょう。コントローラーの中にgetDbAdapterメソッドを実装します。

<?php
 //module/Auth/src/Auth/Controller/AuthController.php

//追加
protected $dbAdapter;

//追加
    public function getDbAdapter()
    {
        if(!$this->dbAdapter){
            $sm = $this->getServiceLocator();
            $this->dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
        }
        return $this->dbAdapter;
    }



このメソッドを用いてデータベースとの接続を行い、認証メソッドを実行します。
以下、利用法です。

<?php
//module/Auth/src/Auth/Controller/AuthController.php

 //追加
use Zend\Authentication\Adapter\DbTable as AuthAdapter;
use Zend\Authentication\AuthenticationService;

//追加
     public function loginAction()
    {
        $form = new LoginForm();
        $request = $this->getRequest();

        if($request->isPost()){
            $user = new User();
            $form->setInputFilter($user->getInputFilter());
            $form->setData($request->getPost());

            if($form->isValid()) {
                $dbAdapter = $this->getDbAdapter();
                $authAdapter = new AuthAdapter($dbAdapter);

                $userData = $form->getData();
                $authAdapter->setTableName('user') //対応するテーブル名                            ->setIdentityColumn('email') //ユニークなカラム名
                           ->setCredentialColumn('password'); //パスワードカラム名
                $authAdapter->setIdentity($userData['email']) //受け取ったデータ
                            ->setCredential($userData['password']);
                $auth = new AuthenticationService(); //必須ではないがAuthenticationServiceを利用
                $result = $auth->authenticate($authAdapter);
                exit(var_dump($result->isValid()));
            }
        }

こんな感じで実装出来ます。

0 件のコメント:

コメントを投稿