導入Zend_Auth は、認証のための API を提供します。 また、一般的な使用例に対応する具象認証アダプタも用意しています。 Zend_Auth が扱うのはあくまでも 認証 (authentication) であり、承認 (authorization) ではありません。 認証 (authentication) とはつまり、あるエンティティが何者であるのかを示す (識別する) ことです。これを、なんらかの条件にもとづいて行います。 承認 (authorization) とは、あるエンティティが他のエンティティに対して アクセスしたり何らかの操作をしたりする権限があるかどうかを判定する処理です。 これは Zend_Auth の対象外となります。 Zend Framework における認証やアクセス制御の詳細については、 Zend_Acl を参照ください。
アダプタZend_Auth アダプタの使用目的は、 LDAP や RDBMS あるいはファイル のような特定の型の認証サービスに対する認証を行うことです。 アダプタによってそのオプションや挙動は大きくことなるでしょうが、 いくつかの基本処理は、あらゆる認証アダプタで共通となります。 たとえば認証条件 (いわゆる ID) を受け取り、 認証サービスに対する問い合わせを行い、 結果を返すという処理は、すべての Zend_Auth アダプタで共通です。 各 Zend_Auth アダプタクラスは、Zend_Auth_Adapter_Interface を実装しています。このインターフェイスで定義されているメソッドが authenticate() で、アダプタクラスは 認証クエリを実行するためにこれを実装する必要があります。 各アダプタクラスは、 authenticate() をコールする前に準備を済ませておく必要があります。 つまり、アダプタ側で用意しなければならない機能としては 認証条件 (ユーザ名およびパスワードなど) の取得や アダプタ固有のオプションの設定 (データベースのテーブルを使用するアダプタならデータベースへの接続設定など) があるということです。 以下にあげるのは認証アダプタのサンプルで、 これはユーザ名とパスワードを受け取って認証を行います。 その他の詳細、例えば認証サービスへの実際の問い合わせなどは、 例を簡潔にするため省略しています。
docblock コメントで説明しているとおり、 authenticate() は Zend_Auth_Result (あるいは Zend_Auth_Result の派生クラス) のインスタンスを返す必要があります。何らかの理由で認証の問い合わせができなかった場合は、 authenticate() は Zend_Auth_Adapter_Exception から派生した例外をスローしなければなりません。 結果Zend_Auth アダプタは、 authenticate() の結果として Zend_Auth_Result のインスタンスを返します。 これにより、認証を試みた結果を表します。アダプタのインスタンスを作成した際に Zend_Auth_Result オブジェクトが作成され、 以下の 4 つのメソッドで Zend_Auth アダプタの結果に対する共通の操作ができます。
認証の結果によって処理を分岐させ、より決め細やかな処理を行いたいこともあるでしょう。 有用な処理としては、たとえば間違ったパスワードを繰り返し入力したアカウントをロックしたり、 存在しない ID を何度も入力した IP アドレスに印をつけたり、 ユーザに対してよりわかりやすいメッセージを返したりといったことがあります。 次の結果コードが使用可能です。 次の例は、結果コードを処理する方法を示すものです。
ID の永続性認証情報 (パスワードなど) を含む認証を要求するのは便利なものですが、 リクエストごとにいちいち認証情報を引き回すのではなく、 認証済みの ID を保持し続けることも重要です。 HTTP はステートレスなプロトコルです。しかし、 クッキーやセッションといった技術によって、 サーバサイドのウェブアプリケーションでも 複数リクエスト間でステート (状態) を保持し続けられるようになりました。 PHP セッションにおけるデフォルトの持続性デフォルトでは、Zend_Auth は、 認証に成功した際の ID 情報を PHP のセッションを使用して保存します。 認証に成功すると、 Zend_Auth::authenticate() は認証結果を持続ストレージに保存します。何も指定しなければ、 Zend_Auth が使用するストレージクラスは Zend_Auth_Storage_Session となります。これは Zend_Session を使用しています。 独自のクラスを使用するには、Zend_Auth_Storage_Interface を実装したクラスのオブジェクトを Zend_Auth::setStorage() で設定します。
Example #1 セッション名前空間の変更 Zend_Auth_Storage_Session は、セッション名前空間として 'Zend_Auth' を使用します。これを変更するには、別の値を Zend_Auth_Storage_Session のコンストラクタで指定します。 この値が、内部で Zend_Session_Namespace のコンストラクタに渡されます。これは認証を試みる前に行う必要があります。 なぜなら、 Zend_Auth::authenticate() は ID を自動的に保存するからです。
独自のストレージの実装Zend_Auth_Storage_Session とは異なる形式で、 ID を持続させたくなることもあるでしょう。そのような場合は、 Zend_Auth_Storage_Interface を実装したクラスのインスタンスを Zend_Auth::setStorage() で設定します。 Example #2 独自のストレージクラスの使用法 ID を持続させるストレージクラスを Zend_Auth_Storage_Session の代わりに使用するには、 Zend_Auth_Storage_Interface を実装します。
このストレージクラスを使用するには、認証クエリの前に Zend_Auth::setStorage() を実行します。
使用法Zend_Auth の使用法には、次の二通りがあります。
次の例は、Zend_Auth アダプタを間接的に Zend_Auth クラスから使用するものです。
上の例においてリクエスト内で認証が行われると、 認証に成功した際にその ID を取得するのは簡単なことです。
永続ストレージから認証 ID を削除するには、単純に clearIdentity() メソッドを使用します。 これは、アプリケーションの "ログアウト" 処理を実装するためのものです。 自動的に永続ストレージが用いられるのがまずい場合もあるでしょう。 そんな場合は、Zend_Auth クラスをバイパスして アダプタクラスを直接使用します。 アダプタクラスを直接使用するとは、アダプタオブジェクトの設定と準備を行い、 その authenticate() メソッドをコールするということです。 アダプタ固有の詳細情報については、各アダプタのドキュメントで説明します。 以下の例は、MyAuthAdapter を直接使用するものです。
|