Zend FrameworkでBASIC認証を行う
Zend FrameworkでBASIC認証を行う方法+認証されていない場合の対処方法をご紹介。
Zend FrameworkでBASIC認証を掛けることがあるとすれば管理画面のような見られたくないよ!というページが多いです。
というかそういうページにかけます。
BASIC認証をかけるには
BASIC認証を書けるには、次のクラスと1つのファイルが必要になります。
- Zend_Auth
- Zend_Auth_Adapter_Http_Resolver_File
- htpasswd(ファイル名は何でもよくて、ファイルの中身が重要になります。)
htpasswdファイルはWeb上から参照されない場所においておくのが好ましいです。
htpasswdの中身は「ユーザー名:realm:パスワード(平文)」と言う形で記述しておきます。
今回は「nully:SeecretRoomofNully:nully_ha_unk」としておきます。
BASIC認証を掛けるコードは以下のようになります。
$resolver = new Zend_Auth_Adapter_Http_Resolver_File();// リゾルバで利用するパスワードファイルを設定する
$resolver->setFile(APPLICATION_PATH. "/htpasswd");
$adapterConfig = array(
"accept_schemes" => "basic", // 認証方法
"realm" => 'SeecretRoomofNully', // BASCI認証ダイアログに表示される文字
"digest_domains" => "/admin", // 認証をかけたいドメイン又はパス
"nonce_time" => 3600, // 生存時間
);
/**
* 認証するためのアダプタはHTTPを利用する
*/
$adapter = new Zend_Auth_Adapter_Http($this->_adapterConfig);
$adapter->setBasicResolver($resolver)
->setRequest($this->getRequest())
->setResponse($this->getResponse());
$result = $adapter->authenticate();
if(!$result->isValid()) {
// ここで認証されてない場合の処理を行う
}
このコードはアクションヘルパーなどに書いてもOKだと思いますが、今回はコントローラー直書きという形です。
後は好みで認証エラーの処理を書きます。
_forwardや_redirectを使わずに認証エラーページを表示するには
いろいろ試してみた結果、_forwardはループしたり、_redirectはループしたりでどうしようかとなやんでいましたが、Zend Frameworkはエラーを例外と関連付けて処理するのが一般的なので、例外を用いて対処します。
「Nully_Exception_InvalidBasicAuthException」という例外クラスを定義し(Zend_Exceptionを継承)、この例外を認証失敗時に投げます。
if(!$result->isValid()) {throw new Nully_Exceptin_InvalidBasicAuthException("ダメ、絶対。");
}
そのあとは、昨日紹介した記事のようなエラーコントローラを作ってあげて、ベーシック認証に失敗した処理を書いて、表示してあげればエラーページを表示することが出来ます。