スパイスラボ神部です。
ちょっと前から悩んでいたのですが、CakePHP でサイト開発をするとき、Basic 認証はどうすればいいのか…という問題があります。CakePHP の Routing と、Apache のディレクトリ構造とは一対一対応ではないため、たとえば特定のコントローラ以下にのみ認証をかけたい場合などは、どこにどうやって .htaceess を置けばいいのか、と言うことに悩んでしまいます。
そこで CakePHP のフォーラムに相談してみたところ、解決方法があまりにも簡単でスマートなことに驚いてしまいました。
Security コンポーネントと beforFilter の活用
解決方法で提示されていたのが、こちらのブログエントリ。
-CakePHPでBasic認証対応ページを作る - blog.katsuma.tv
こちらにあるとおり、まず controller 冒頭で、
var $components = array('Security');
を設定し、次に beforeFilter 内で
$this->Security->loginOptions = array('type'=>'basic');
$this->Security->loginUsers = array(''=>' ');
$this->Security->requireLogin('*');
と指定するだけ。* は全アクションを指定するワイルドカードのようです。
あまりにも簡単なので、ちょっと応用してみましょう。
サイトルートに Basic 認証をかけるには?
ここでちょっと悩むのが、home.ctp など、Router.php で密かに pages_controller を通じて呼ばれているページ群。しかしこれも /cake/libs/controller/pages_controller.php の中に同様に設定するだけ。
以前、【CakePHP】ちょっと考えてしまいがちな home.ctp のレイアウト変更 ( ラボブログ ) の記事のときにはページごとにレイアウトを指定したかったのでこの方法ではだめでしたが、今回は素直に pages_controller のお世話になりました。
これで
・サイトルートは認証をかける
・コントローラA以下には認証をかける(サイトルートと別のアカウントも可能)
・コントローラB以下はフリーアクセス
ということができ、通常の .htaccess によるディレクトリ以下の一斉指定よりも柔軟な運用ができるのではないかと思います。
この情報は参考になりましたか?
追記:ちょっと心配なこと
この指定方法の場合、htpassword を使うときと違い、パスワードが平文です。ここはちょっと心配なので、引き続き別の指定方法(define を使うとか?)でソースコードから隠蔽できないかフォーラムに引き続き相談してみようと覆います。
追記2:アクションリストの指定の方法
-cakePHP1.2でBasic認証|TONTTU.NET 群馬県 太田市
こちらに、アクションのリストを指定する方法や、Basic 認証のときに出せるメッセージなどを調整できます。
関連記事


