はじめに
今日の消費者は、本当に目が高くなったと思いませんか? 今の買い手は、大衆向けの標準的製品では満足せず、自分の好みや要求に合わせて変更できる製品を探し求めています。iPodの刻印サービス、カスタム仕様のサイオン、さらにはモノグラムの郵便切手まで、独自の市場を開拓する企業(と消費者)は枚挙にいとまがありません。
Webは私たちの日常生活に欠かせない存在であり、いうまでもなく社会的市場の主要な部分のため、消費者が、この仮想世界に対しても現実世界と同じレベルの期待を抱くようになったのも不思議ではありません。スポーツのスコア速報のカスタム表示、地域別ニュース、テーラーメイドの製品カタログはすべて、今日のWebサイトに一般的な機能です。もちろん、The Amazing Kreskin(米国の著名な読心術師)の力を借りなくても済むように、Webサイト開発者は何らかの方法でユーザーを各自のオンライン設定に対応付ける必要があります。そのための標準的な方法は、各ユーザー用のアカウントを作成し、そのアカウントでログインしてもらうということです。このアカウントは、ユーザーと、ユーザーがWebサイトを閲覧する際に実行するアクション(例えば電子ブックを購入する、出身地としてオハイオ州コロンバスを選択する、ピッツバーグ発のスポーツ関連ニュースだけを見たいと指定するなど)を結び付ける役割を果たします。
ユーザーアカウント機能を作成するために必要な処理は、単にアカウント情報を格納するためのデータベーステーブルを作成して、登録フォームやログインフォームに対応付けることだけではありません。誤ったアカウントが作成されないようにするための保護策(例えばアカウントのアクティベーションの前にユーザーに電子メールアドレスの確認を求めるなど)を講じたり、ユーザーがWebサイトを閲覧している間じゅうそのセッションを維持したり、アカウントからログアウトするための簡単な機構を提供したり、ユーザーがパスワードを忘れた場合に簡単に復元できるような手段を設けたりすることも、併せて検討する必要があります。このような機能が多くの開発現場で求められているという現状を踏まえて、Zend Frameworkには、Zend_Authという強力なコンポーネントが同梱されています。このコンポーネントにより、ユーザーアカウントの作成と管理にかかる時間を大幅に短縮できます。このチュートリアルでは、ユーザーアカウントを管理するための基本ブロックを作成し、ユーザーを登録し、ユーザーがWebサイトにログイン/ログアウトできるようにする方法を説明します。
ユーザー登録機能を作成する
ユーザー登録機能を作成するには、アカウント情報を格納する場所が必要です。その場所として最も適しているのは、アカウント情報のために用意した専用のデータベーステーブルの中です。そのためのMySQLテーブルスキーマの例を次に示します。
CREATE TABLE account { id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL, pswd CHAR(32) NOT NULL, recovery_key CHAR(32) DEFAULT "" }
このテーブルの内容は見れば分かると思いますが、pswd
列とrecovery_key
列について説明を補足しておきます。ユーザーのパスワードは必ずPHPのmd5()関数を用いてハッシュ形式で格納されます。これにより、攻撃者が何らかの手段によってデータベースへのアクセスを得たとしても、プレーンテキストのパスワードが解読される可能性は極めて低くなります。md5()
関数は任意の文字列を32文字のハッシュに変換するため、pswd
列はCHAR(32)
と定義されています。recovery_key
列は、このチュートリアルの後の部分で、パスワードの復元が必要になった場合にユーザーの認証情報を確認するための32文字のランダム文字列を格納するために使用します。
もちろん、実際に使うアカウントデータベースの場合には、このアカウントテーブルを拡張して、ユーザーの住所、電話番号、生年月日など、その他の関連情報を格納できるようにする必要が出てくるでしょう。ここでは、チュートリアルでの使用を目的としているため、最小限の項目のみにとどめますが、実際に作成する場合には、自分の目的に応じて必要な項目を追加してください。
アカウントモデル
次に、Zend Frameworkで定義される一般的な慣習に従って、アカウントモデルを作成します。最初のモデルの機能は最小限とし、後から必要に応じて機能を追加していくことにします。
class Default_Model_Customer extends Zend_Db_Table_Abstract { protected $_name = 'customer'; }
アカウント登録フォーム
次に作成するのは、登録フォームです。図1に示すような、最小限の必須項目のみを含むフォームを作成します。ご覧のとおりの変哲もないフォームなので、スクリーンショットのみでコードは省略し、このフォームの情報を処理するためのコントローラアクションの説明に移りたいと思います。