新規ドキュメントはこちら(http://ozaki.kyoichi.jp/content/blogsection/4/26/)に掲載しております。

ログイン処理の実装

DB(pear)を組み込むの章で作成したアクションを改良します。現状では、validatorを通れば無条件でHelloWorldモジュールのHelloWorldDBアクションにフォワードされてしまいますが、これをデータベースを参照して、入力されたユーザIDとパスワードが正しいか確認を行った上でユーザを成功ページへフォワードするように修正します。

まずユーザIDとパスワードを保持するテーブルを作成しておきます

[k-ozaki@free15 ~]$ psql myproject myproject

myproject=> create table m_login (
myproject(>     user_id varchar(16) not null,
myproject(>     password varchar(16) not null,
myproject(>     constraint m_login_pkey primary key (user_id),
myproject(>     constraint m_login_fkey foreign key (user_id) references m_user (user_id));
myproject=> insert into m_login values ('ozaki', 'secretword');

ユーザIDとパスワードよりユーザValueを返すメソッドを作成します。新たにLoginServiceとLoginDAOクラスを作成します。MyProject/webapp/ilb/JP/BANCHO/Logic/Service/LoginService.class.phpは以下のようになります

<?php
/*
 * ログインに関するサービス
 * @access public
 * @package JP/BANCHO/Logic/Service/
 * @category Service
 * @author Kyoichi Ozaki 
 * @sourcefile
 *
 */
class LoginService extends Service {

  /*
   * コンストラクタ
   * @access public
   *
   */
  function __construct() {
    parent::__construct();
  }

  /*
   * ユーザIDコードとパスワードによりユーザの詳細を返します
   * @access public
   * @param String ユーザID
   * @param String パスワード
   * @return Object UserValue
   * 
   */
  function searchUserByIdAndPassword($userId, $password) {

    $dao = new LoginDAO($this->db);
    $value = $dao->searchUserByIdAndPassword($userId, $password);

    return $value;
  }

} 
?>

MyProject/webapp/ilb/JP/BANCHO/Database/DAO/LoginDAO.class.phpは以下のようになります

<?php
/*
 * ログインに関わるデータにアクセスするクラス
 * @access public
 * @package JP/BANCHO/Database/DAO
 * @category DAO
 * @author Kyoichi Ozaki 
 * @sourcefile
 *
 */
class LoginDAO extends DataAccessObject {

  function __construct($db) {
    parent::__construct($db);
  }

  /*
   * ユーザIDとパスワードによりユーザの詳細を返します
   * @access public
   * @param String ユーザID
   * @param String パスワード
   * @return Object UserValue
   * 
   */
  function searchUserByIdAndPassword($userId, $password) {

    $sql = " select a.USER_ID, a.FIRST_NAME, a.LAST_NAME ";
    $sql.= " from M_USER a ";
    $sql.= " left join M_LOGIN b on a.USER_ID=b.USER_ID ";
    $sql.= " where b.USER_ID = '".$userId."' ";
    $sql.= " and b.PASSWORD = '".$password."' ";
    
    $rs =& $this->db->query($sql);
    if (DB::isError($rs))
      throw new DatabaseException($rs->getMessage(), $rs->getCode());

    $value = NULL;
    if ($row =& $rs->fetchRow()) {
      $value = new UserValue();
      
      $value->setUserId($row[0]);
      $value->setFirstName($row[1]);
      $value->setLastName($row[2]);
    }
    
    return $value;
    
  }

}
?>

上記2クラスをautoload.iniに追加します。もうこの辺りはお決まりになってきているので、説明は不要だとは思います。MyProject/webapp/config/autoload.iniに以下の2行を追加します

    LoginDAO            = "%MO_WEBAPP_DIR%/lib/JP/BANCHO/Database/DAO/LoginDAO.class.php" 
    LoginService        = "%MO_WEBAPP_DIR%/lib/JP/BANCHO/Logic/Service/LoginService.class.php"

最後に、Login処理を行うLoginCommitアクションを修正します。MyProject/webapp/modules/Default/actions/LoginCommitAction.class.phpは以下のようになります

<?php
class LoginCommitAction extends MyAction
{

    public function execute ()
    {

        $context    =& $this->getContext();
        $controller =& $context->getController();
        $request    =& $context->getRequest();
        $user       =& $context->getUser();

	$userId   = $request->getParameter('loginName');
	$password = $request->getParameter('password');

        $service = new LoginService ();
	$userValue = $service->searchUserByIdAndPassword($userId, $password);
	if ($userValue != NULL &&
	    $userValue->getUserId() == $userId) {

	  $user->setAuthenticated(TRUE);
	  $controller->forward('HelloWorld', 'HelloWorldDB');

	}

	$request->setError('login', 'ユーザIDまたはパスワードが間違っています');
        $controller->forward(MO_LOGIN_MODULE, MO_LOGIN_ACTION);	
    }

    public function handleError ()
    {
        $context    =& $this->getContext();
        $controller =& $context->getController();
        $controller->forward(MO_LOGIN_MODULE, MO_LOGIN_ACTION);

    }
    
}
?>

これで修正は完了です。ログイン画面に行き、SQLでINSERTした通りのユーザID(ozaki)とパスワード(secretword)を入力してください。HelloWorldDBアクションに転送されれば正しく修正できています。また、パスワードをあやまって入力した場合にはエラー画面に遷移することも確認しましょう。

http://192.168.0.15/MyProject/index.php?module=Default&action=Login

まとめると、今回のポイントは: