CakePHPの案件で一時的に特定のページ以下にBasic認証を付けたいという要望があって対応したのですが、CakePHP2系からはSecurityコンポーネントを使ったベーシック認証が廃止されたんですね。
2系では基本的にデータベースを利用してユーザ管理し、その情報を利用してAuthコンポーネントで実装するようです。
認証 ? CakePHP Cookbook 2.x ドキュメント
。。。面倒。
というわけで、コンポーネントを利用せず、PHPで直接書いてみました。
コンポーネントを利用せずにBasic認証を実装する
対象のコントローラやアクションに直接記述します。
// パスワードはConfigureとか定数とかクラス変数などで定義するといいと思います。
// ここでは変数で書いちゃいます。
$loginId = 'hoge';
$loginPassword = 'fuga';
$this->autoRender = false;
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die("id / password Required");
} else {
if ($_SERVER['PHP_AUTH_USER'] != $loginId || $_SERVER['PHP_AUTH_PW'] != $loginPassword) {
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die("Invalid id / password combination. Please try again");
}
}
$this->autoRender = true;
// あとは普通に処理を書く
ベーシック認証が通るまではautoRenderを切ってます。
ベーシック認証はセキュリティが甘いので、恒久的な認証には向かないし、平文でIDパスワードが送信されないようにSSL下で使うのが好ましいでしょう。
参考にさせていただいたサイト
PHPでBasic認証設定してみた【PHP】 – 麹町で働くWebエンジニアのメモ帳
